meshagent-cli 0.49.1__tar.gz → 0.50.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.49.1 → meshagent_cli-0.50.0}/PKG-INFO +17 -17
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/cli_test.py +21 -1
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/process.py +51 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/rooms.py +21 -6
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/rooms_test.py +60 -3
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/services.py +75 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/services_test.py +67 -0
- meshagent_cli-0.50.0/meshagent/cli/version.py +1 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/PKG-INFO +17 -17
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/requires.txt +16 -16
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/pyproject.toml +16 -16
- meshagent_cli-0.49.1/meshagent/cli/version.py +0 -1
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/LICENSE +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/README.md +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/__init__.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/_filedrop.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agent.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agent_cli_options_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agent_package_cli.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agent_package_cli_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agents.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agents_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/ask.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/ask_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/async_typer.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/async_typer_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/auth.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/auth_async.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/auth_async_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/auth_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/call.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/chatbot.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/cli.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/cli_mcp.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/common_options.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/config.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/config_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/containers.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/containers_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/__init__.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/slack-channel/channel.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/slack-channel/scripts/configure-slack.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/slack-channel/scripts/setup-slack-dev-route.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/slack-channel/server.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/telegram-channel/channel.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/configure-telegram.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/create-bot-token.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/telegram-channel/server.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/twilio-channel/channel.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/twilio-channel/server.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/whatsapp-channel/channel.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/whatsapp-channel/server.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/dataset.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/dataset_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/developer.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/developer_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/doctor.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/doctor_templates/__init__.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/doctor_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/feeds.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/feeds_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/helper.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/helper_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/helpers.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/host.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/iam.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/iam_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/image.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/image_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/launch.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/launch_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/llm.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/llm_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/local_settings.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/local_settings_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mailbot.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mailbot_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mailboxes.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mailboxes_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/meeting_transcriber.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/memory.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/memory_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/meshagent_images.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/meshagent_images_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/messaging.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/messaging_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mounts.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/multi.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/oci_archive.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/oci_archive_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/participant_token.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/port.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/port_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/preamble_rules.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/preamble_rules_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/process_live_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/process_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/projects.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/projects_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/queue.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/queue_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/registry.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/registry_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room_connect.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room_connect_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room_services.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room_services_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/root_commands.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/root_commands_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/routes.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/routes_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sample_channel_http_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sample_channel_live_e2e_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/scheduled_tasks.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/scheduled_tasks_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/secrets.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/secrets_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/service_accounts.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/service_accounts_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sessions.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sessions_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sqlite.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sqlite_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/storage.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/storage_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/subscriptions.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sync.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sync_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/task_runner.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/task_runner_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/testing.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/thread_inspect.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/thread_inspect_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/thread_sidebar.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tool_call_summary.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tool_call_summary_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tool_integrations.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tool_integrations_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/__init__.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/auth_switch.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/auth_switch_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/create.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/deploy_room.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/deploy_room_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/project_activate.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/project_activate_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/setup.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/setup_splash_frames.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/setup_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/version_check.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/version_check_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/voicebot.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/volumes.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/volumes_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/webserver.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/webserver_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/worker.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/worker_test.py +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/SOURCES.txt +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/dependency_links.txt +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/entry_points.txt +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/top_level.txt +0 -0
- {meshagent_cli-0.49.1 → meshagent_cli-0.50.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.50.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.50.0
|
|
26
|
+
Requires-Dist: meshagent-codex==0.50.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.50.0; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-api[all]==0.50.0; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-commoncrawl==0.50.0; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-scrapy==0.50.0; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-computers==0.50.0; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-openai==0.50.0; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-anthropic==0.50.0; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-otel==0.50.0; extra == "all"
|
|
43
|
+
Requires-Dist: meshagent-mcp==0.50.0; extra == "all"
|
|
44
|
+
Requires-Dist: meshagent-tools==0.50.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.50.0; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-api==0.50.0; extra == "mcp-service"
|
|
50
|
+
Requires-Dist: meshagent-mcp==0.50.0; extra == "mcp-service"
|
|
51
|
+
Requires-Dist: meshagent-tools==0.50.0; extra == "mcp-service"
|
|
52
52
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
53
53
|
Dynamic: license-file
|
|
54
54
|
|
|
@@ -4,7 +4,7 @@ import types
|
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
6
|
|
|
7
|
-
from meshagent.api import RoomException
|
|
7
|
+
from meshagent.api import RoomDisabledError, RoomException
|
|
8
8
|
from meshagent.agents import channel_process
|
|
9
9
|
from meshagent.cli import async_typer
|
|
10
10
|
from meshagent.cli import cli
|
|
@@ -134,6 +134,26 @@ def test_app_prints_room_exception_without_traceback(capsys) -> None:
|
|
|
134
134
|
assert captured.out == ""
|
|
135
135
|
|
|
136
136
|
|
|
137
|
+
def test_app_prints_disabled_room_message_and_exits_nonzero(capsys) -> None:
|
|
138
|
+
app = async_typer.AsyncTyper()
|
|
139
|
+
|
|
140
|
+
@app.callback()
|
|
141
|
+
def app_callback() -> None:
|
|
142
|
+
pass
|
|
143
|
+
|
|
144
|
+
@app.command("connect")
|
|
145
|
+
def connect_command() -> None:
|
|
146
|
+
raise RoomDisabledError()
|
|
147
|
+
|
|
148
|
+
with pytest.raises(SystemExit) as exc_info:
|
|
149
|
+
app(["connect"])
|
|
150
|
+
|
|
151
|
+
assert exc_info.value.code == 1
|
|
152
|
+
captured = capsys.readouterr()
|
|
153
|
+
assert captured.err == "This room is currently disabled.\n"
|
|
154
|
+
assert captured.out == ""
|
|
155
|
+
|
|
156
|
+
|
|
137
157
|
def test_main_exits_with_status_returned_by_async_typer(monkeypatch) -> None:
|
|
138
158
|
monkeypatch.setattr(channel_process, "dispatch_main", lambda **kwargs: False)
|
|
139
159
|
monkeypatch.setattr(cli, "app", lambda: 23)
|
|
@@ -2178,6 +2178,7 @@ ThreadStorageBackends = ThreadStorageBackend | str | list[str] | tuple[str, ...]
|
|
|
2178
2178
|
DEFAULT_PROCESS_THREAD_STORAGE_BACKENDS: tuple[str, ...] = ("dataset",)
|
|
2179
2179
|
ContextManagementMode = Literal["auto", "standalone", "none"]
|
|
2180
2180
|
ProcessToolSearchMode = Literal["room", "agent", "none"]
|
|
2181
|
+
LlmDelegationPolicy = Literal["required", "optional"]
|
|
2181
2182
|
|
|
2182
2183
|
ShellCopyEnvOption = Annotated[
|
|
2183
2184
|
list[str],
|
|
@@ -4701,6 +4702,7 @@ def _build_runtime_agent(
|
|
|
4701
4702
|
verbose_dataset: bool = False,
|
|
4702
4703
|
save_audio_input: bool = False,
|
|
4703
4704
|
preamble_rule: bool = True,
|
|
4705
|
+
llm_delegation: LlmDelegationPolicy = "optional",
|
|
4704
4706
|
):
|
|
4705
4707
|
builder = _builder_for_runtime(runtime)
|
|
4706
4708
|
selected_models = (
|
|
@@ -4790,6 +4792,7 @@ def _build_runtime_agent(
|
|
|
4790
4792
|
builder_kwargs["preamble_rule"] = preamble_rule
|
|
4791
4793
|
builder_kwargs["websocket_auth"] = websocket_auth
|
|
4792
4794
|
builder_kwargs["room_token"] = room_token
|
|
4795
|
+
builder_kwargs["llm_delegation"] = llm_delegation
|
|
4793
4796
|
return builder(**builder_kwargs)
|
|
4794
4797
|
|
|
4795
4798
|
|
|
@@ -5482,6 +5485,7 @@ def build_process_agent(
|
|
|
5482
5485
|
verbose_dataset: bool = False,
|
|
5483
5486
|
save_audio_input: bool = False,
|
|
5484
5487
|
preamble_rule: bool = True,
|
|
5488
|
+
llm_delegation: LlmDelegationPolicy = "optional",
|
|
5485
5489
|
):
|
|
5486
5490
|
from meshagent.agents import (
|
|
5487
5491
|
AgentMessageThreadStatusPublisher,
|
|
@@ -6108,6 +6112,12 @@ def build_process_agent(
|
|
|
6108
6112
|
connection = await provider.adapter.create_realtime_connection(
|
|
6109
6113
|
protocol=protocol,
|
|
6110
6114
|
model=resolved_model,
|
|
6115
|
+
llm_authorization_token=(
|
|
6116
|
+
start_thread.llm_authorization.token
|
|
6117
|
+
if start_thread.llm_authorization is not None
|
|
6118
|
+
and not start_thread.llm_authorization.is_expired()
|
|
6119
|
+
else None
|
|
6120
|
+
),
|
|
6111
6121
|
)
|
|
6112
6122
|
return AgentRealtimeConnectionInfo(
|
|
6113
6123
|
protocol=connection.protocol,
|
|
@@ -6936,6 +6946,7 @@ def build_process_agent(
|
|
|
6936
6946
|
turns=turns,
|
|
6937
6947
|
)
|
|
6938
6948
|
),
|
|
6949
|
+
llm_delegation=llm_delegation,
|
|
6939
6950
|
)
|
|
6940
6951
|
if room is not None:
|
|
6941
6952
|
process.register_content_scheme(_room_content_scheme(room=room))
|
|
@@ -7194,6 +7205,13 @@ async def join(
|
|
|
7194
7205
|
Optional[str],
|
|
7195
7206
|
typer.Option(..., help="Delegate LLM interactions to a remote participant"),
|
|
7196
7207
|
] = None,
|
|
7208
|
+
llm_delegation: Annotated[
|
|
7209
|
+
LlmDelegationPolicy,
|
|
7210
|
+
typer.Option(
|
|
7211
|
+
"--llm-delegation",
|
|
7212
|
+
help="Require per-turn LLM delegation or allow it when provided.",
|
|
7213
|
+
),
|
|
7214
|
+
] = "optional",
|
|
7197
7215
|
decision_model: DecisionModelOption = None,
|
|
7198
7216
|
transcription_model: TranscriptionModelOption = (
|
|
7199
7217
|
DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
|
|
@@ -7403,6 +7421,7 @@ async def join(
|
|
|
7403
7421
|
require_discovery=require_discovery,
|
|
7404
7422
|
require_advanced_shell=require_advanced_shell,
|
|
7405
7423
|
llm_participant=llm_participant,
|
|
7424
|
+
llm_delegation=llm_delegation,
|
|
7406
7425
|
decision_model=decision_model,
|
|
7407
7426
|
transcription_model=transcription_model,
|
|
7408
7427
|
voice=voice,
|
|
@@ -7689,6 +7708,13 @@ async def service(
|
|
|
7689
7708
|
Optional[str],
|
|
7690
7709
|
typer.Option(..., help="Delegate LLM interactions to a remote participant"),
|
|
7691
7710
|
] = None,
|
|
7711
|
+
llm_delegation: Annotated[
|
|
7712
|
+
LlmDelegationPolicy,
|
|
7713
|
+
typer.Option(
|
|
7714
|
+
"--llm-delegation",
|
|
7715
|
+
help="Require per-turn LLM delegation or allow it when provided.",
|
|
7716
|
+
),
|
|
7717
|
+
] = "optional",
|
|
7692
7718
|
decision_model: DecisionModelOption = None,
|
|
7693
7719
|
transcription_model: TranscriptionModelOption = (
|
|
7694
7720
|
DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
|
|
@@ -7865,6 +7891,7 @@ async def service(
|
|
|
7865
7891
|
require_discovery=require_discovery,
|
|
7866
7892
|
require_advanced_shell=require_advanced_shell,
|
|
7867
7893
|
llm_participant=llm_participant,
|
|
7894
|
+
llm_delegation=llm_delegation,
|
|
7868
7895
|
decision_model=decision_model,
|
|
7869
7896
|
transcription_model=transcription_model,
|
|
7870
7897
|
voice=voice,
|
|
@@ -8125,6 +8152,13 @@ async def spec(
|
|
|
8125
8152
|
Optional[str],
|
|
8126
8153
|
typer.Option(..., help="Delegate LLM interactions to a remote participant"),
|
|
8127
8154
|
] = None,
|
|
8155
|
+
llm_delegation: Annotated[
|
|
8156
|
+
LlmDelegationPolicy,
|
|
8157
|
+
typer.Option(
|
|
8158
|
+
"--llm-delegation",
|
|
8159
|
+
help="Require per-turn LLM delegation or allow it when provided.",
|
|
8160
|
+
),
|
|
8161
|
+
] = "optional",
|
|
8128
8162
|
decision_model: DecisionModelOption = None,
|
|
8129
8163
|
transcription_model: TranscriptionModelOption = (
|
|
8130
8164
|
DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
|
|
@@ -8281,6 +8315,7 @@ async def spec(
|
|
|
8281
8315
|
require_discovery=require_discovery,
|
|
8282
8316
|
require_advanced_shell=require_advanced_shell,
|
|
8283
8317
|
llm_participant=llm_participant,
|
|
8318
|
+
llm_delegation=llm_delegation,
|
|
8284
8319
|
decision_model=decision_model,
|
|
8285
8320
|
transcription_model=transcription_model,
|
|
8286
8321
|
voice=voice,
|
|
@@ -8557,6 +8592,13 @@ async def deploy(
|
|
|
8557
8592
|
Optional[str],
|
|
8558
8593
|
typer.Option(..., help="Delegate LLM interactions to a remote participant"),
|
|
8559
8594
|
] = None,
|
|
8595
|
+
llm_delegation: Annotated[
|
|
8596
|
+
LlmDelegationPolicy,
|
|
8597
|
+
typer.Option(
|
|
8598
|
+
"--llm-delegation",
|
|
8599
|
+
help="Require per-turn LLM delegation or allow it when provided.",
|
|
8600
|
+
),
|
|
8601
|
+
] = "optional",
|
|
8560
8602
|
decision_model: DecisionModelOption = None,
|
|
8561
8603
|
transcription_model: TranscriptionModelOption = (
|
|
8562
8604
|
DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
|
|
@@ -8716,6 +8758,7 @@ async def deploy(
|
|
|
8716
8758
|
require_discovery=require_discovery,
|
|
8717
8759
|
require_advanced_shell=require_advanced_shell,
|
|
8718
8760
|
llm_participant=llm_participant,
|
|
8761
|
+
llm_delegation=llm_delegation,
|
|
8719
8762
|
decision_model=decision_model,
|
|
8720
8763
|
transcription_model=transcription_model,
|
|
8721
8764
|
voice=voice,
|
|
@@ -11061,6 +11104,13 @@ async def run(
|
|
|
11061
11104
|
Optional[str],
|
|
11062
11105
|
typer.Option(..., help="Delegate LLM interactions to a remote participant"),
|
|
11063
11106
|
] = None,
|
|
11107
|
+
llm_delegation: Annotated[
|
|
11108
|
+
LlmDelegationPolicy,
|
|
11109
|
+
typer.Option(
|
|
11110
|
+
"--llm-delegation",
|
|
11111
|
+
help="Require per-turn LLM delegation or allow it when provided.",
|
|
11112
|
+
),
|
|
11113
|
+
] = "optional",
|
|
11064
11114
|
decision_model: DecisionModelOption = None,
|
|
11065
11115
|
transcription_model: TranscriptionModelOption = (
|
|
11066
11116
|
DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
|
|
@@ -11375,6 +11425,7 @@ async def run(
|
|
|
11375
11425
|
require_discovery=require_discovery,
|
|
11376
11426
|
require_advanced_shell=require_advanced_shell,
|
|
11377
11427
|
llm_participant=llm_participant,
|
|
11428
|
+
llm_delegation=llm_delegation,
|
|
11378
11429
|
decision_model=decision_model,
|
|
11379
11430
|
transcription_model=transcription_model,
|
|
11380
11431
|
voice=voice,
|
|
@@ -199,6 +199,7 @@ async def room_create_command(
|
|
|
199
199
|
"name": room.name,
|
|
200
200
|
"metadata": room.metadata,
|
|
201
201
|
"annotations": room.annotations,
|
|
202
|
+
"enabled": room.enabled,
|
|
202
203
|
},
|
|
203
204
|
indent=2,
|
|
204
205
|
)
|
|
@@ -245,7 +246,11 @@ async def room_update_command(
|
|
|
245
246
|
project_id: ProjectIdOption,
|
|
246
247
|
id: Annotated[Optional[str], typer.Option(help="Room ID (preferred)")] = None,
|
|
247
248
|
name: Optional[str] = None,
|
|
248
|
-
new_name: Annotated[str, typer.Option(
|
|
249
|
+
new_name: Annotated[Optional[str], typer.Option(help="New room name")] = None,
|
|
250
|
+
enabled: Annotated[
|
|
251
|
+
Optional[bool],
|
|
252
|
+
typer.Option("--enabled/--disabled", help="Enable or disable the room"),
|
|
253
|
+
] = None,
|
|
249
254
|
annotations: Annotated[
|
|
250
255
|
Optional[str],
|
|
251
256
|
typer.Option(
|
|
@@ -255,7 +260,7 @@ async def room_update_command(
|
|
|
255
260
|
] = None,
|
|
256
261
|
):
|
|
257
262
|
"""
|
|
258
|
-
Update a room's name (ID is preferred; name will be resolved to ID if needed).
|
|
263
|
+
Update a room's name or enabled state (ID is preferred; name will be resolved to ID if needed).
|
|
259
264
|
"""
|
|
260
265
|
account_client = await get_client()
|
|
261
266
|
try:
|
|
@@ -265,15 +270,23 @@ async def room_update_command(
|
|
|
265
270
|
account_client, project_id=project_id, room_id=id, room_name=room_name
|
|
266
271
|
)
|
|
267
272
|
annotations_obj = _maybe_parse_string_dict_json("annotations", annotations)
|
|
273
|
+
if new_name is None and annotations_obj is None and enabled is None:
|
|
274
|
+
raise RoomException(
|
|
275
|
+
"Provide at least one of --new-name, --annotations, --enabled, or --disabled."
|
|
276
|
+
)
|
|
277
|
+
if new_name is None:
|
|
278
|
+
current_room = await account_client.get_room(
|
|
279
|
+
project_id=project_id, name=rid
|
|
280
|
+
)
|
|
281
|
+
new_name = current_room.name
|
|
268
282
|
|
|
269
|
-
print(
|
|
270
|
-
f"[bold green]Updating room id={rid} -> name='{new_name}'...[/bold green]"
|
|
271
|
-
)
|
|
283
|
+
print(f"[bold green]Updating room id={rid}...[/bold green]")
|
|
272
284
|
await account_client.update_room(
|
|
273
285
|
project_id=project_id,
|
|
274
286
|
room_id=rid,
|
|
275
287
|
name=new_name,
|
|
276
288
|
annotations=annotations_obj,
|
|
289
|
+
enabled=enabled,
|
|
277
290
|
)
|
|
278
291
|
print("[bold cyan]Room updated.[/bold cyan]")
|
|
279
292
|
except RoomException as ex:
|
|
@@ -348,13 +361,14 @@ async def room_list_command(
|
|
|
348
361
|
"name": r.name,
|
|
349
362
|
"metadata": r.metadata,
|
|
350
363
|
"annotations": r.annotations,
|
|
364
|
+
"enabled": r.enabled,
|
|
351
365
|
}
|
|
352
366
|
for r in rooms
|
|
353
367
|
]
|
|
354
368
|
if o == "json":
|
|
355
369
|
print(json.dumps(output, indent=2))
|
|
356
370
|
elif output:
|
|
357
|
-
print_json_table(output, "id", "name")
|
|
371
|
+
print_json_table(output, "id", "name", "enabled")
|
|
358
372
|
else:
|
|
359
373
|
print("No rooms found.")
|
|
360
374
|
except RoomException as ex:
|
|
@@ -392,6 +406,7 @@ async def room_get_command(
|
|
|
392
406
|
"name": r.name,
|
|
393
407
|
"metadata": r.metadata,
|
|
394
408
|
"annotations": r.annotations,
|
|
409
|
+
"enabled": r.enabled,
|
|
395
410
|
},
|
|
396
411
|
indent=2,
|
|
397
412
|
)
|
|
@@ -20,6 +20,8 @@ class _FakeRoomsClient:
|
|
|
20
20
|
self.closed = False
|
|
21
21
|
self.list_rooms_page_calls: list[dict[str, object]] = []
|
|
22
22
|
self.create_room_calls: list[dict[str, object]] = []
|
|
23
|
+
self.update_room_calls: list[dict[str, object]] = []
|
|
24
|
+
self.get_room_calls: list[dict[str, object]] = []
|
|
23
25
|
|
|
24
26
|
async def list_rooms_page(
|
|
25
27
|
self,
|
|
@@ -70,6 +72,29 @@ class _FakeRoomsClient:
|
|
|
70
72
|
annotations=annotations or {},
|
|
71
73
|
)
|
|
72
74
|
|
|
75
|
+
async def get_room(self, *, project_id: str, name: str) -> Room:
|
|
76
|
+
self.get_room_calls.append({"project_id": project_id, "name": name})
|
|
77
|
+
return self.rooms_result[0]
|
|
78
|
+
|
|
79
|
+
async def update_room(
|
|
80
|
+
self,
|
|
81
|
+
*,
|
|
82
|
+
project_id: str,
|
|
83
|
+
room_id: str,
|
|
84
|
+
name: str,
|
|
85
|
+
annotations: dict[str, str] | None = None,
|
|
86
|
+
enabled: bool | None = None,
|
|
87
|
+
) -> None:
|
|
88
|
+
self.update_room_calls.append(
|
|
89
|
+
{
|
|
90
|
+
"project_id": project_id,
|
|
91
|
+
"room_id": room_id,
|
|
92
|
+
"name": name,
|
|
93
|
+
"annotations": annotations,
|
|
94
|
+
"enabled": enabled,
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
|
|
73
98
|
async def close(self) -> None:
|
|
74
99
|
self.closed = True
|
|
75
100
|
|
|
@@ -83,6 +108,35 @@ def _sample_room() -> Room:
|
|
|
83
108
|
)
|
|
84
109
|
|
|
85
110
|
|
|
111
|
+
@pytest.mark.asyncio
|
|
112
|
+
async def test_room_update_can_disable_without_renaming(
|
|
113
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
114
|
+
) -> None:
|
|
115
|
+
client = _FakeRoomsClient(rooms_result=[_sample_room()])
|
|
116
|
+
_patch_room_list_command(monkeypatch, client=client)
|
|
117
|
+
monkeypatch.setattr(rooms, "print", lambda *args, **kwargs: None)
|
|
118
|
+
|
|
119
|
+
await rooms.room_update_command(
|
|
120
|
+
project_id="project-1",
|
|
121
|
+
id="room-1",
|
|
122
|
+
enabled=False,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
assert client.get_room_calls == [
|
|
126
|
+
{"project_id": "resolved-project", "name": "room-1"}
|
|
127
|
+
]
|
|
128
|
+
assert client.update_room_calls == [
|
|
129
|
+
{
|
|
130
|
+
"project_id": "resolved-project",
|
|
131
|
+
"room_id": "room-1",
|
|
132
|
+
"name": "demo",
|
|
133
|
+
"annotations": None,
|
|
134
|
+
"enabled": False,
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
assert client.closed is True
|
|
138
|
+
|
|
139
|
+
|
|
86
140
|
def _patch_room_list_command(
|
|
87
141
|
monkeypatch: pytest.MonkeyPatch,
|
|
88
142
|
*,
|
|
@@ -179,8 +233,9 @@ def test_route_create_help_mentions_short_domains_and_service_id_annotation() ->
|
|
|
179
233
|
assert result.exit_code == 0
|
|
180
234
|
normalized_output = " ".join(result.output.split())
|
|
181
235
|
assert "Use a short, DNS-safe domain name" in normalized_output
|
|
182
|
-
assert "long
|
|
183
|
-
assert "domains
|
|
236
|
+
assert "DNS-safe; long" in normalized_output
|
|
237
|
+
assert "room-name-derived domains" in normalized_output
|
|
238
|
+
assert "may be rejected" in normalized_output
|
|
184
239
|
assert "meshagent.service.id" in result.output
|
|
185
240
|
|
|
186
241
|
|
|
@@ -220,9 +275,10 @@ async def test_room_list_defaults_to_table_output(
|
|
|
220
275
|
"name": "demo",
|
|
221
276
|
"metadata": {"team": "core"},
|
|
222
277
|
"annotations": {"meshagent.storage.class": "ephemeral"},
|
|
278
|
+
"enabled": True,
|
|
223
279
|
}
|
|
224
280
|
],
|
|
225
|
-
("id", "name"),
|
|
281
|
+
("id", "name", "enabled"),
|
|
226
282
|
)
|
|
227
283
|
]
|
|
228
284
|
assert client.closed is True
|
|
@@ -337,6 +393,7 @@ async def test_room_list_json_output_skips_table_printer(
|
|
|
337
393
|
"name": "demo",
|
|
338
394
|
"metadata": {"team": "core"},
|
|
339
395
|
"annotations": {"meshagent.storage.class": "ephemeral"},
|
|
396
|
+
"enabled": True,
|
|
340
397
|
}
|
|
341
398
|
]
|
|
342
399
|
|
|
@@ -1810,6 +1810,79 @@ async def service_run(
|
|
|
1810
1810
|
await my_client.close()
|
|
1811
1811
|
|
|
1812
1812
|
|
|
1813
|
+
async def _set_service_enabled(
|
|
1814
|
+
*,
|
|
1815
|
+
project_id: str | None,
|
|
1816
|
+
service_id: str,
|
|
1817
|
+
room: str | None,
|
|
1818
|
+
enabled: bool,
|
|
1819
|
+
) -> None:
|
|
1820
|
+
client = await get_client()
|
|
1821
|
+
try:
|
|
1822
|
+
resolved_project_id = await resolve_project_id(project_id=project_id)
|
|
1823
|
+
scope = _ServiceCommandScope(room_name=room)
|
|
1824
|
+
service = await _get_service_for_show(
|
|
1825
|
+
client=client,
|
|
1826
|
+
project_id=resolved_project_id,
|
|
1827
|
+
scope=scope,
|
|
1828
|
+
identifier=service_id,
|
|
1829
|
+
)
|
|
1830
|
+
record_id = _require_service_record_id(service)
|
|
1831
|
+
await _update_service_in_scope(
|
|
1832
|
+
client=client,
|
|
1833
|
+
project_id=resolved_project_id,
|
|
1834
|
+
scope=scope,
|
|
1835
|
+
service_id=record_id,
|
|
1836
|
+
spec=service.model_copy(update={"enabled": enabled}),
|
|
1837
|
+
)
|
|
1838
|
+
state = "enabled" if enabled else "disabled"
|
|
1839
|
+
print(f"[green]Service {record_id} {state}.[/]")
|
|
1840
|
+
finally:
|
|
1841
|
+
await client.close()
|
|
1842
|
+
|
|
1843
|
+
|
|
1844
|
+
@app.async_command("enable")
|
|
1845
|
+
async def service_enable(
|
|
1846
|
+
*,
|
|
1847
|
+
project_id: ProjectIdOption,
|
|
1848
|
+
service_id: Annotated[
|
|
1849
|
+
str,
|
|
1850
|
+
typer.Argument(help="Service UUID or metadata name to enable"),
|
|
1851
|
+
],
|
|
1852
|
+
room: Annotated[
|
|
1853
|
+
Optional[str], typer.Option("--room", help="Room name")
|
|
1854
|
+
] = os.getenv("MESHAGENT_ROOM"),
|
|
1855
|
+
):
|
|
1856
|
+
"""Enable a service so it can start and run."""
|
|
1857
|
+
await _set_service_enabled(
|
|
1858
|
+
project_id=project_id,
|
|
1859
|
+
service_id=service_id,
|
|
1860
|
+
room=room,
|
|
1861
|
+
enabled=True,
|
|
1862
|
+
)
|
|
1863
|
+
|
|
1864
|
+
|
|
1865
|
+
@app.async_command("disable")
|
|
1866
|
+
async def service_disable(
|
|
1867
|
+
*,
|
|
1868
|
+
project_id: ProjectIdOption,
|
|
1869
|
+
service_id: Annotated[
|
|
1870
|
+
str,
|
|
1871
|
+
typer.Argument(help="Service UUID or metadata name to disable"),
|
|
1872
|
+
],
|
|
1873
|
+
room: Annotated[
|
|
1874
|
+
Optional[str], typer.Option("--room", help="Room name")
|
|
1875
|
+
] = os.getenv("MESHAGENT_ROOM"),
|
|
1876
|
+
):
|
|
1877
|
+
"""Disable a service, stopping it and preventing future starts."""
|
|
1878
|
+
await _set_service_enabled(
|
|
1879
|
+
project_id=project_id,
|
|
1880
|
+
service_id=service_id,
|
|
1881
|
+
room=room,
|
|
1882
|
+
enabled=False,
|
|
1883
|
+
)
|
|
1884
|
+
|
|
1885
|
+
|
|
1813
1886
|
@app.async_command("get")
|
|
1814
1887
|
async def service_get(
|
|
1815
1888
|
*,
|
|
@@ -1867,6 +1940,7 @@ async def service_list(
|
|
|
1867
1940
|
{
|
|
1868
1941
|
"id": svc.id,
|
|
1869
1942
|
"name": svc.metadata.name,
|
|
1943
|
+
"enabled": svc.enabled,
|
|
1870
1944
|
"image": svc.container.image
|
|
1871
1945
|
if svc.container is not None
|
|
1872
1946
|
else None,
|
|
@@ -1875,6 +1949,7 @@ async def service_list(
|
|
|
1875
1949
|
],
|
|
1876
1950
|
"id",
|
|
1877
1951
|
"name",
|
|
1952
|
+
"enabled",
|
|
1878
1953
|
"image",
|
|
1879
1954
|
)
|
|
1880
1955
|
finally:
|
|
@@ -298,6 +298,7 @@ def _service_record(
|
|
|
298
298
|
id: str,
|
|
299
299
|
name: str,
|
|
300
300
|
service_annotation_id: Optional[str],
|
|
301
|
+
enabled: bool = True,
|
|
301
302
|
) -> services.ServiceSpec:
|
|
302
303
|
annotations: dict[str, str] | None = None
|
|
303
304
|
if service_annotation_id is not None:
|
|
@@ -306,6 +307,7 @@ def _service_record(
|
|
|
306
307
|
version="v1",
|
|
307
308
|
kind="Service",
|
|
308
309
|
id=id,
|
|
310
|
+
enabled=enabled,
|
|
309
311
|
metadata=services.ServiceMetadata(name=name, annotations=annotations),
|
|
310
312
|
ports=[],
|
|
311
313
|
container=None,
|
|
@@ -1105,6 +1107,71 @@ async def test_service_update_template_room_prints_only_updated_service_id(
|
|
|
1105
1107
|
assert client.closed is True
|
|
1106
1108
|
|
|
1107
1109
|
|
|
1110
|
+
@pytest.mark.asyncio
|
|
1111
|
+
async def test_service_disable_updates_room_service_by_name(
|
|
1112
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
1113
|
+
) -> None:
|
|
1114
|
+
printed = _capture_prints(monkeypatch)
|
|
1115
|
+
client = _ServiceCommandClient()
|
|
1116
|
+
service_id = "550e8400-e29b-41d4-a716-446655440000"
|
|
1117
|
+
client.room_services = [
|
|
1118
|
+
_service_record(
|
|
1119
|
+
id=service_id,
|
|
1120
|
+
name="assistant",
|
|
1121
|
+
service_annotation_id=None,
|
|
1122
|
+
)
|
|
1123
|
+
]
|
|
1124
|
+
_patch_service_command_runtime(monkeypatch, client=client)
|
|
1125
|
+
|
|
1126
|
+
await services.service_disable(
|
|
1127
|
+
project_id=None,
|
|
1128
|
+
service_id="assistant",
|
|
1129
|
+
room="chatbot3",
|
|
1130
|
+
)
|
|
1131
|
+
|
|
1132
|
+
assert client.get_room_by_name_calls == [("project-1", "chatbot3", "assistant")]
|
|
1133
|
+
assert len(client.update_room_calls) == 1
|
|
1134
|
+
assert client.update_room_calls[0][0:3] == (
|
|
1135
|
+
"project-1",
|
|
1136
|
+
"chatbot3",
|
|
1137
|
+
service_id,
|
|
1138
|
+
)
|
|
1139
|
+
assert client.update_room_calls[0][3].enabled is False
|
|
1140
|
+
assert printed == [f"[green]Service {service_id} disabled.[/]"]
|
|
1141
|
+
assert client.closed is True
|
|
1142
|
+
|
|
1143
|
+
|
|
1144
|
+
@pytest.mark.asyncio
|
|
1145
|
+
async def test_service_enable_updates_global_service_by_id(
|
|
1146
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
1147
|
+
) -> None:
|
|
1148
|
+
printed = _capture_prints(monkeypatch)
|
|
1149
|
+
client = _ServiceCommandClient()
|
|
1150
|
+
service_id = "550e8400-e29b-41d4-a716-446655440000"
|
|
1151
|
+
client.services = [
|
|
1152
|
+
_service_record(
|
|
1153
|
+
id=service_id,
|
|
1154
|
+
name="assistant",
|
|
1155
|
+
service_annotation_id=None,
|
|
1156
|
+
enabled=False,
|
|
1157
|
+
)
|
|
1158
|
+
]
|
|
1159
|
+
_patch_service_command_runtime(monkeypatch, client=client)
|
|
1160
|
+
|
|
1161
|
+
await services.service_enable(
|
|
1162
|
+
project_id=None,
|
|
1163
|
+
service_id=service_id,
|
|
1164
|
+
room=None,
|
|
1165
|
+
)
|
|
1166
|
+
|
|
1167
|
+
assert client.get_calls == [("project-1", service_id)]
|
|
1168
|
+
assert len(client.update_calls) == 1
|
|
1169
|
+
assert client.update_calls[0][0:2] == ("project-1", service_id)
|
|
1170
|
+
assert client.update_calls[0][2].enabled is True
|
|
1171
|
+
assert printed == [f"[green]Service {service_id} enabled.[/]"]
|
|
1172
|
+
assert client.closed is True
|
|
1173
|
+
|
|
1174
|
+
|
|
1108
1175
|
@pytest.mark.asyncio
|
|
1109
1176
|
async def test_service_get_resolves_room_service_by_name(
|
|
1110
1177
|
monkeypatch: pytest.MonkeyPatch,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.50.0"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.50.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.50.0
|
|
26
|
+
Requires-Dist: meshagent-codex==0.50.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.50.0; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-api[all]==0.50.0; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-commoncrawl==0.50.0; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-scrapy==0.50.0; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-computers==0.50.0; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-openai==0.50.0; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-anthropic==0.50.0; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-otel==0.50.0; extra == "all"
|
|
43
|
+
Requires-Dist: meshagent-mcp==0.50.0; extra == "all"
|
|
44
|
+
Requires-Dist: meshagent-tools==0.50.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.50.0; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-api==0.50.0; extra == "mcp-service"
|
|
50
|
+
Requires-Dist: meshagent-mcp==0.50.0; extra == "mcp-service"
|
|
51
|
+
Requires-Dist: meshagent-tools==0.50.0; extra == "mcp-service"
|
|
52
52
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
53
53
|
Dynamic: license-file
|
|
54
54
|
|