meshagent-cli 0.53.0__tar.gz → 0.53.2__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.53.0 → meshagent_cli-0.53.2}/PKG-INFO +17 -17
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/cli.py +5 -0
- meshagent_cli-0.53.2/meshagent/cli/sysadmin.py +5 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/users.py +195 -17
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/users_test.py +94 -8
- meshagent_cli-0.53.2/meshagent/cli/version.py +1 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/PKG-INFO +17 -17
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/SOURCES.txt +1 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/requires.txt +16 -16
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/pyproject.toml +16 -16
- meshagent_cli-0.53.0/meshagent/cli/version.py +0 -1
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/LICENSE +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/README.md +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/__init__.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/_filedrop.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agent.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agent_cli_options_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agent_package_cli.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agent_package_cli_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agents.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agents_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/ask.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/ask_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/async_typer.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/async_typer_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/auth.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/auth_async.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/auth_async_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/auth_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/call.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/chatbot.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/cli_mcp.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/cli_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/common_options.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/config.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/config_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/containers.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/containers_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/__init__.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/slack-channel/channel.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/slack-channel/scripts/configure-slack.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/slack-channel/scripts/setup-slack-dev-route.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/slack-channel/server.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/telegram-channel/channel.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/configure-telegram.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/create-bot-token.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/telegram-channel/server.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/twilio-channel/channel.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/twilio-channel/server.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/whatsapp-channel/channel.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/whatsapp-channel/server.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/custom_domains.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/custom_domains_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/dataset.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/dataset_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/developer.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/developer_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/doctor.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/doctor_templates/__init__.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/doctor_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/feeds.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/feeds_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/helper.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/helper_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/helpers.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/host.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/iam.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/iam_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/image.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/image_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/launch.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/launch_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/llm.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/llm_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/local_settings.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/local_settings_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mailbot.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mailbot_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mailboxes.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mailboxes_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/meeting_transcriber.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/memory.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/memory_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/meshagent_images.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/meshagent_images_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/messaging.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/messaging_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mounts.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/multi.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/oauth_clients.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/oauth_clients_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/oci_archive.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/oci_archive_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/participant_token.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/port.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/port_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/preamble_rules.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/preamble_rules_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/process.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/process_live_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/process_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/projects.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/projects_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/queue.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/queue_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/registry.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/registry_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room_connect.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room_connect_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room_services.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room_services_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/rooms.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/rooms_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/root_commands.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/root_commands_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/routes.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/routes_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sample_channel_http_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sample_channel_live_e2e_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/scheduled_tasks.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/scheduled_tasks_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/secrets.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/secrets_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/service_accounts.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/service_accounts_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/services.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/services_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sessions.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sessions_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite_recovery.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite_recovery_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite_transfer_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/storage.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/storage_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/subscriptions.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sync.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sync_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/task_runner.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/task_runner_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/testing.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/thread_inspect.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/thread_inspect_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/thread_sidebar.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tool_call_summary.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tool_call_summary_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tool_integrations.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tool_integrations_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/__init__.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/auth_switch.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/auth_switch_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/create.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/deploy_room.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/deploy_room_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/project_activate.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/project_activate_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/setup.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/setup_splash_frames.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/setup_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/version_check.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/version_check_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/voicebot.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/volumes.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/volumes_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/webserver.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/webserver_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/worker.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/worker_test.py +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/dependency_links.txt +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/entry_points.txt +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/top_level.txt +0 -0
- {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.53.
|
|
3
|
+
Version: 0.53.2
|
|
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.53.
|
|
26
|
-
Requires-Dist: meshagent-codex==0.53.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.53.2
|
|
26
|
+
Requires-Dist: meshagent-codex==0.53.2
|
|
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.53.
|
|
36
|
-
Requires-Dist: meshagent-api[all]==0.53.
|
|
37
|
-
Requires-Dist: meshagent-commoncrawl==0.53.
|
|
38
|
-
Requires-Dist: meshagent-scrapy==0.53.
|
|
39
|
-
Requires-Dist: meshagent-computers==0.53.
|
|
40
|
-
Requires-Dist: meshagent-openai==0.53.
|
|
41
|
-
Requires-Dist: meshagent-anthropic==0.53.
|
|
42
|
-
Requires-Dist: meshagent-otel==0.53.
|
|
43
|
-
Requires-Dist: meshagent-mcp==0.53.
|
|
44
|
-
Requires-Dist: meshagent-tools==0.53.
|
|
35
|
+
Requires-Dist: meshagent-agents[all]==0.53.2; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-api[all]==0.53.2; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-commoncrawl==0.53.2; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-scrapy==0.53.2; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-computers==0.53.2; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-openai==0.53.2; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-anthropic==0.53.2; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-otel==0.53.2; extra == "all"
|
|
43
|
+
Requires-Dist: meshagent-mcp==0.53.2; extra == "all"
|
|
44
|
+
Requires-Dist: meshagent-tools==0.53.2; 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.53.
|
|
49
|
-
Requires-Dist: meshagent-api==0.53.
|
|
50
|
-
Requires-Dist: meshagent-mcp==0.53.
|
|
51
|
-
Requires-Dist: meshagent-tools==0.53.
|
|
48
|
+
Requires-Dist: meshagent-agents[all]==0.53.2; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-api==0.53.2; extra == "mcp-service"
|
|
50
|
+
Requires-Dist: meshagent-mcp==0.53.2; extra == "mcp-service"
|
|
51
|
+
Requires-Dist: meshagent-tools==0.53.2; extra == "mcp-service"
|
|
52
52
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
53
53
|
Dynamic: license-file
|
|
54
54
|
|
|
@@ -108,6 +108,11 @@ app.add_lazy_command(
|
|
|
108
108
|
module="meshagent.cli.iam",
|
|
109
109
|
help="Manage IAM policies for project resources",
|
|
110
110
|
)
|
|
111
|
+
app.add_lazy_command(
|
|
112
|
+
name="sysadmin",
|
|
113
|
+
module="meshagent.cli.sysadmin",
|
|
114
|
+
help="Administer global account profiles",
|
|
115
|
+
)
|
|
111
116
|
app.add_lazy_command(
|
|
112
117
|
name="user",
|
|
113
118
|
module="meshagent.cli.users",
|
|
@@ -1,21 +1,46 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import math
|
|
3
|
+
from enum import Enum
|
|
3
4
|
from typing import Annotated
|
|
4
5
|
|
|
5
6
|
import typer
|
|
7
|
+
from meshagent.api import RoomException
|
|
8
|
+
from meshagent.api.client import ProjectMembersPage, UpdateUserProfileRequest, User
|
|
9
|
+
from meshagent.cli import async_typer
|
|
10
|
+
from meshagent.cli.common_options import OutputFormatOption, ProjectIdOption
|
|
11
|
+
from meshagent.cli.helper import get_client, resolve_project_id
|
|
6
12
|
from pydantic import JsonValue, TypeAdapter
|
|
7
13
|
from rich import print
|
|
8
14
|
from rich.console import Console
|
|
9
15
|
from rich.table import Table
|
|
10
16
|
from rich.text import Text
|
|
11
17
|
|
|
12
|
-
from meshagent.api import RoomException
|
|
13
|
-
from meshagent.api.client import ProjectMembersPage, User
|
|
14
|
-
from meshagent.cli import async_typer
|
|
15
|
-
from meshagent.cli.common_options import OutputFormatOption, ProjectIdOption
|
|
16
|
-
from meshagent.cli.helper import get_client, resolve_project_id
|
|
17
|
-
|
|
18
18
|
app = async_typer.AsyncTyper(help="List project users and manage user profiles")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ProfileView(str, Enum):
|
|
22
|
+
project = "project"
|
|
23
|
+
user = "user"
|
|
24
|
+
merged = "merged"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ProfileField(str, Enum):
|
|
28
|
+
first_name = "first_name"
|
|
29
|
+
last_name = "last_name"
|
|
30
|
+
metadata = "metadata"
|
|
31
|
+
annotations = "annotations"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
ProfileViewOption = Annotated[
|
|
35
|
+
ProfileView, typer.Option("--view", help="Profile attributes to return")
|
|
36
|
+
]
|
|
37
|
+
GlobalOption = Annotated[
|
|
38
|
+
bool,
|
|
39
|
+
typer.Option(
|
|
40
|
+
"--global", help="Use your global account profile, ignoring the active project"
|
|
41
|
+
),
|
|
42
|
+
]
|
|
43
|
+
|
|
19
44
|
UserIdArgument = Annotated[
|
|
20
45
|
str, typer.Argument(help="User id, or me for your own profile")
|
|
21
46
|
]
|
|
@@ -91,6 +116,7 @@ def _print_table(records: list[dict[str, object]], *columns: str) -> None:
|
|
|
91
116
|
async def list_users(
|
|
92
117
|
*,
|
|
93
118
|
project_id: ProjectIdOption,
|
|
119
|
+
view: ProfileViewOption = ProfileView.merged,
|
|
94
120
|
count: Annotated[
|
|
95
121
|
int, typer.Option("--count", min=1, help="Maximum number of users to return")
|
|
96
122
|
] = 100,
|
|
@@ -114,6 +140,7 @@ async def list_users(
|
|
|
114
140
|
page_size=min(count - len(result.users), 100),
|
|
115
141
|
continuation_token=result.continuation_token,
|
|
116
142
|
filter=filter,
|
|
143
|
+
view=view.value,
|
|
117
144
|
)
|
|
118
145
|
if (
|
|
119
146
|
page.continuation_token is not None
|
|
@@ -127,7 +154,9 @@ async def list_users(
|
|
|
127
154
|
finally:
|
|
128
155
|
await client.close()
|
|
129
156
|
if o == "json":
|
|
130
|
-
_print_json(
|
|
157
|
+
_print_json(
|
|
158
|
+
result.model_dump(mode="json", exclude_unset=view == ProfileView.project)
|
|
159
|
+
)
|
|
131
160
|
return
|
|
132
161
|
if not result.users:
|
|
133
162
|
print("No users found")
|
|
@@ -154,25 +183,42 @@ async def list_users(
|
|
|
154
183
|
|
|
155
184
|
|
|
156
185
|
@app.async_command(
|
|
157
|
-
"get", help="Get a user profile
|
|
186
|
+
"get", help="Get a project user profile or your global account profile."
|
|
158
187
|
)
|
|
159
188
|
async def get(
|
|
160
|
-
*,
|
|
189
|
+
*,
|
|
190
|
+
user_id: UserIdArgument = "me",
|
|
191
|
+
project_id: ProjectIdOption,
|
|
192
|
+
view: ProfileViewOption = ProfileView.merged,
|
|
193
|
+
global_profile: GlobalOption = False,
|
|
194
|
+
o: OutputFormatOption = "table",
|
|
161
195
|
) -> None:
|
|
162
196
|
_validate_output(o)
|
|
197
|
+
if global_profile:
|
|
198
|
+
project_id = None
|
|
199
|
+
if view == ProfileView.project and project_id is None:
|
|
200
|
+
raise typer.BadParameter("--view project requires --project-id")
|
|
163
201
|
client = await get_client()
|
|
164
202
|
try:
|
|
165
|
-
|
|
203
|
+
row = await client.get_user_profile(
|
|
204
|
+
user_id, project_id=project_id, view=view.value
|
|
205
|
+
)
|
|
166
206
|
finally:
|
|
167
207
|
await client.close()
|
|
168
|
-
row = user.model_dump(mode="json")
|
|
169
208
|
if o == "json":
|
|
170
209
|
_print_json(row)
|
|
171
210
|
return
|
|
172
|
-
row
|
|
173
|
-
|
|
211
|
+
_print_profile(row)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _print_profile(row: dict) -> None:
|
|
215
|
+
values = {
|
|
216
|
+
name: row.get(name) for name in ("id", "email", "first_name", "last_name")
|
|
217
|
+
}
|
|
218
|
+
values["metadata"] = json.dumps(row.get("metadata", {}))
|
|
219
|
+
values["annotations"] = json.dumps(row.get("annotations", {}))
|
|
174
220
|
_print_table(
|
|
175
|
-
[
|
|
221
|
+
[values], "id", "email", "first_name", "last_name", "metadata", "annotations"
|
|
176
222
|
)
|
|
177
223
|
|
|
178
224
|
|
|
@@ -183,6 +229,13 @@ async def update(
|
|
|
183
229
|
*,
|
|
184
230
|
project_id: ProjectIdOption,
|
|
185
231
|
user_id: UserIdArgument = "me",
|
|
232
|
+
global_profile: GlobalOption = False,
|
|
233
|
+
inherit: Annotated[
|
|
234
|
+
list[ProfileField] | None,
|
|
235
|
+
typer.Option(
|
|
236
|
+
"--inherit", help="Remove a project override; repeat for multiple fields"
|
|
237
|
+
),
|
|
238
|
+
] = None,
|
|
186
239
|
first_name: Annotated[
|
|
187
240
|
str | None, typer.Option("--first-name", help="First name")
|
|
188
241
|
] = None,
|
|
@@ -204,12 +257,31 @@ async def update(
|
|
|
204
257
|
o: OutputFormatOption = "table",
|
|
205
258
|
) -> None:
|
|
206
259
|
_validate_output(o)
|
|
207
|
-
if
|
|
260
|
+
if (
|
|
261
|
+
all(value is None for value in (first_name, last_name, metadata, annotations))
|
|
262
|
+
and not inherit
|
|
263
|
+
):
|
|
208
264
|
raise typer.BadParameter("supply at least one profile field to update")
|
|
209
265
|
parsed_metadata = _parse_object(metadata, "metadata")
|
|
210
266
|
parsed_annotations = _parse_annotations(annotations)
|
|
211
|
-
if
|
|
212
|
-
project_id =
|
|
267
|
+
if global_profile:
|
|
268
|
+
project_id = None
|
|
269
|
+
if parsed_annotations is not None and project_id is None:
|
|
270
|
+
raise typer.BadParameter(
|
|
271
|
+
"Global annotations require the sysadmin user update command"
|
|
272
|
+
)
|
|
273
|
+
if inherit and project_id is None:
|
|
274
|
+
raise typer.BadParameter("--inherit requires --project-id")
|
|
275
|
+
supplied = {
|
|
276
|
+
"first_name": first_name,
|
|
277
|
+
"last_name": last_name,
|
|
278
|
+
"metadata": metadata,
|
|
279
|
+
"annotations": annotations,
|
|
280
|
+
}
|
|
281
|
+
if inherit and any(supplied[field.value] is not None for field in inherit):
|
|
282
|
+
raise typer.BadParameter(
|
|
283
|
+
"A field cannot be supplied and inherited in the same update"
|
|
284
|
+
)
|
|
213
285
|
client = await get_client()
|
|
214
286
|
try:
|
|
215
287
|
result = await client.update_user_profile(
|
|
@@ -219,6 +291,7 @@ async def update(
|
|
|
219
291
|
metadata=parsed_metadata,
|
|
220
292
|
annotations=parsed_annotations,
|
|
221
293
|
project_id=project_id,
|
|
294
|
+
**({"inherit": [field.value for field in inherit]} if inherit else {}),
|
|
222
295
|
)
|
|
223
296
|
finally:
|
|
224
297
|
await client.close()
|
|
@@ -226,3 +299,108 @@ async def update(
|
|
|
226
299
|
_print_json(result)
|
|
227
300
|
else:
|
|
228
301
|
print("User profile updated")
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
sysadmin_app = async_typer.AsyncTyper(
|
|
305
|
+
help="Search and edit global user profiles; requires sysadmin access"
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
@sysadmin_app.async_command(
|
|
310
|
+
"list", help="Search global users by email, name, or user id."
|
|
311
|
+
)
|
|
312
|
+
async def list_sysadmin_users(
|
|
313
|
+
*,
|
|
314
|
+
filter: Annotated[str | None, typer.Option("--filter")] = None,
|
|
315
|
+
count: Annotated[int, typer.Option("--count", min=1)] = 100,
|
|
316
|
+
continuation_token: Annotated[
|
|
317
|
+
str | None, typer.Option("--continuation-token")
|
|
318
|
+
] = None,
|
|
319
|
+
o: OutputFormatOption = "table",
|
|
320
|
+
) -> None:
|
|
321
|
+
_validate_output(o)
|
|
322
|
+
client = await get_client()
|
|
323
|
+
records: list[User] = []
|
|
324
|
+
try:
|
|
325
|
+
while len(records) < count:
|
|
326
|
+
page = await client.search_sysadmin_users(
|
|
327
|
+
filter=filter,
|
|
328
|
+
page_size=min(count - len(records), 100),
|
|
329
|
+
continuation_token=continuation_token,
|
|
330
|
+
)
|
|
331
|
+
records.extend(page.users)
|
|
332
|
+
if (
|
|
333
|
+
page.continuation_token == continuation_token
|
|
334
|
+
and page.continuation_token is not None
|
|
335
|
+
):
|
|
336
|
+
raise RoomException("User listing continuation token did not advance")
|
|
337
|
+
continuation_token = page.continuation_token
|
|
338
|
+
if continuation_token is None:
|
|
339
|
+
break
|
|
340
|
+
finally:
|
|
341
|
+
await client.close()
|
|
342
|
+
rows = [record.model_dump(mode="json") for record in records]
|
|
343
|
+
if o == "json":
|
|
344
|
+
_print_json({"users": rows, "continuation_token": continuation_token})
|
|
345
|
+
else:
|
|
346
|
+
_print_table(rows, "id", "email", "first_name", "last_name")
|
|
347
|
+
if continuation_token is not None:
|
|
348
|
+
typer.echo(f"Continuation token: {continuation_token}")
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
@sysadmin_app.async_command("get", help="Get a global user profile.")
|
|
352
|
+
async def get_sysadmin_user(
|
|
353
|
+
*, user_id: UserIdArgument = "me", o: OutputFormatOption = "table"
|
|
354
|
+
) -> None:
|
|
355
|
+
_validate_output(o)
|
|
356
|
+
client = await get_client()
|
|
357
|
+
try:
|
|
358
|
+
user = await client.get_sysadmin_user_profile(user_id)
|
|
359
|
+
finally:
|
|
360
|
+
await client.close()
|
|
361
|
+
row = user.model_dump(mode="json")
|
|
362
|
+
if o == "json":
|
|
363
|
+
_print_json(row)
|
|
364
|
+
else:
|
|
365
|
+
_print_profile(row)
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
@sysadmin_app.async_command(
|
|
369
|
+
"update", help="Update global names, metadata, or annotations."
|
|
370
|
+
)
|
|
371
|
+
async def update_sysadmin_user(
|
|
372
|
+
*,
|
|
373
|
+
user_id: UserIdArgument = "me",
|
|
374
|
+
first_name: Annotated[str | None, typer.Option("--first-name")] = None,
|
|
375
|
+
last_name: Annotated[str | None, typer.Option("--last-name")] = None,
|
|
376
|
+
metadata: Annotated[
|
|
377
|
+
str | None, typer.Option("--metadata", help="Replacement JSON object")
|
|
378
|
+
] = None,
|
|
379
|
+
annotations: Annotated[
|
|
380
|
+
str | None, typer.Option("--annotations", help="Replacement string map")
|
|
381
|
+
] = None,
|
|
382
|
+
o: OutputFormatOption = "table",
|
|
383
|
+
) -> None:
|
|
384
|
+
_validate_output(o)
|
|
385
|
+
if all(value is None for value in (first_name, last_name, metadata, annotations)):
|
|
386
|
+
raise typer.BadParameter("supply at least one profile field to update")
|
|
387
|
+
fields = {
|
|
388
|
+
key: value
|
|
389
|
+
for key, value in {
|
|
390
|
+
"first_name": first_name,
|
|
391
|
+
"last_name": last_name,
|
|
392
|
+
"metadata": _parse_object(metadata, "metadata"),
|
|
393
|
+
"annotations": _parse_annotations(annotations),
|
|
394
|
+
}.items()
|
|
395
|
+
if value is not None
|
|
396
|
+
}
|
|
397
|
+
update = UpdateUserProfileRequest.model_validate(fields)
|
|
398
|
+
client = await get_client()
|
|
399
|
+
try:
|
|
400
|
+
result = await client.update_sysadmin_user_profile(user_id, update=update)
|
|
401
|
+
finally:
|
|
402
|
+
await client.close()
|
|
403
|
+
if o == "json":
|
|
404
|
+
_print_json(result)
|
|
405
|
+
else:
|
|
406
|
+
print("Global user profile updated")
|
|
@@ -3,14 +3,17 @@ import logging
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
|
-
from pydantic import JsonValue
|
|
7
|
-
from rich.console import Console
|
|
8
|
-
|
|
9
6
|
from meshagent.api import RoomException
|
|
10
|
-
from meshagent.api.client import
|
|
7
|
+
from meshagent.api.client import (
|
|
8
|
+
ProjectMemberAccess,
|
|
9
|
+
ProjectMembersPage,
|
|
10
|
+
User,
|
|
11
|
+
UserProfilesPage,
|
|
12
|
+
)
|
|
11
13
|
from meshagent.cli import cli, users
|
|
12
14
|
from meshagent.cli.testing import CliRunner
|
|
13
|
-
|
|
15
|
+
from pydantic import JsonValue
|
|
16
|
+
from rich.console import Console
|
|
14
17
|
|
|
15
18
|
PROFILE = User(
|
|
16
19
|
id="user-1",
|
|
@@ -42,13 +45,16 @@ class FakeClient:
|
|
|
42
45
|
page_size: int,
|
|
43
46
|
continuation_token: str | None,
|
|
44
47
|
filter: str | None,
|
|
48
|
+
view: str = "merged",
|
|
45
49
|
) -> ProjectMembersPage:
|
|
46
50
|
self.list_calls.append((project_id, page_size, continuation_token, filter))
|
|
47
51
|
if self.error:
|
|
48
52
|
raise self.error
|
|
49
53
|
return self.pages.pop(0)
|
|
50
54
|
|
|
51
|
-
async def get_user_profile(
|
|
55
|
+
async def get_user_profile(
|
|
56
|
+
self, user_id: str, *, project_id: str | None = None, view: str = "merged"
|
|
57
|
+
) -> dict[str, object]:
|
|
52
58
|
self.get_calls.append(user_id)
|
|
53
59
|
if self.error:
|
|
54
60
|
raise self.error
|
|
@@ -63,6 +69,7 @@ class FakeClient:
|
|
|
63
69
|
metadata: dict[str, JsonValue] | None,
|
|
64
70
|
annotations: dict[str, str] | None,
|
|
65
71
|
project_id: str | None,
|
|
72
|
+
inherit: list[str] | None = None,
|
|
66
73
|
) -> dict[str, bool]:
|
|
67
74
|
self.update_calls.append(
|
|
68
75
|
{
|
|
@@ -78,6 +85,28 @@ class FakeClient:
|
|
|
78
85
|
raise self.error
|
|
79
86
|
return {"ok": True}
|
|
80
87
|
|
|
88
|
+
async def search_sysadmin_users(
|
|
89
|
+
self, *, filter=None, page_size=100, continuation_token=None
|
|
90
|
+
):
|
|
91
|
+
self.list_calls.append(("sysadmin", page_size, continuation_token, filter))
|
|
92
|
+
if self.error:
|
|
93
|
+
raise self.error
|
|
94
|
+
return UserProfilesPage(users=[PROFILE])
|
|
95
|
+
|
|
96
|
+
async def get_sysadmin_user_profile(self, user_id):
|
|
97
|
+
self.get_calls.append(user_id)
|
|
98
|
+
if self.error:
|
|
99
|
+
raise self.error
|
|
100
|
+
return PROFILE
|
|
101
|
+
|
|
102
|
+
async def update_sysadmin_user_profile(self, user_id, *, update):
|
|
103
|
+
self.update_calls.append(
|
|
104
|
+
{"user_id": user_id, **update.model_dump(exclude_unset=True)}
|
|
105
|
+
)
|
|
106
|
+
if self.error:
|
|
107
|
+
raise self.error
|
|
108
|
+
return {"ok": True}
|
|
109
|
+
|
|
81
110
|
|
|
82
111
|
@pytest.fixture
|
|
83
112
|
def client(
|
|
@@ -300,8 +329,8 @@ def test_annotations_require_project_before_client_creation(
|
|
|
300
329
|
monkeypatch.setattr("meshagent.cli.helper.get_active_project", no_project)
|
|
301
330
|
result = CliRunner().invoke(users.app, ["update", "--annotations", "{}"])
|
|
302
331
|
|
|
303
|
-
assert result.exit_code ==
|
|
304
|
-
assert "
|
|
332
|
+
assert result.exit_code == 2, result.output
|
|
333
|
+
assert "sysadmin user update" in result.output
|
|
305
334
|
assert not client.update_calls and not client.closed
|
|
306
335
|
|
|
307
336
|
|
|
@@ -319,3 +348,60 @@ def test_api_errors_are_reported_and_client_closed(
|
|
|
319
348
|
assert error.value.code == 1
|
|
320
349
|
assert "user_profile_editor is required" in capsys.readouterr().err
|
|
321
350
|
assert client.closed
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
@pytest.mark.parametrize(
|
|
354
|
+
"args",
|
|
355
|
+
[
|
|
356
|
+
["list", "--filter", "alice", "-o", "json"],
|
|
357
|
+
["get", "user-1", "-o", "json"],
|
|
358
|
+
["update", "user-1", "--annotations", '{"verified":"yes"}', "-o", "json"],
|
|
359
|
+
],
|
|
360
|
+
)
|
|
361
|
+
def test_sysadmin_user_commands_use_global_admin_apis(args, client):
|
|
362
|
+
result = CliRunner().invoke(cli.app, ["sysadmin", "user", *args])
|
|
363
|
+
assert result.exit_code == 0, result.output
|
|
364
|
+
assert client.closed
|
|
365
|
+
if args[0] == "list":
|
|
366
|
+
assert json.loads(result.stdout)["users"][0]["id"] == "user-1"
|
|
367
|
+
assert client.list_calls == [("sysadmin", 100, None, "alice")]
|
|
368
|
+
elif args[0] == "update":
|
|
369
|
+
assert client.update_calls == [
|
|
370
|
+
{"user_id": "user-1", "annotations": {"verified": "yes"}}
|
|
371
|
+
]
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
@pytest.mark.parametrize(
|
|
375
|
+
"args", [["get", "user-1"], ["list"], ["update", "user-1", "--annotations", "{}"]]
|
|
376
|
+
)
|
|
377
|
+
def test_sysadmin_cli_reports_denials_and_closes_client(args, client, capsys):
|
|
378
|
+
client.error = RoomException("Status=403, body=sysadmin is required")
|
|
379
|
+
with pytest.raises(SystemExit):
|
|
380
|
+
users.sysadmin_app(args)
|
|
381
|
+
assert "sysadmin is required" in capsys.readouterr().err
|
|
382
|
+
assert client.closed
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def test_global_flag_ignores_active_project(client, monkeypatch):
|
|
386
|
+
monkeypatch.setenv("MESHAGENT_PROJECT_ID", "project-1")
|
|
387
|
+
result = CliRunner().invoke(
|
|
388
|
+
users.app, ["update", "--global", "--first-name", "Global"]
|
|
389
|
+
)
|
|
390
|
+
assert result.exit_code == 0, result.output
|
|
391
|
+
assert client.update_calls[0]["project_id"] is None
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
@pytest.mark.parametrize(
|
|
395
|
+
"args",
|
|
396
|
+
[
|
|
397
|
+
["get", "--view", "invalid"],
|
|
398
|
+
["get", "--view", "project"],
|
|
399
|
+
["update", "--inherit", "metadata"],
|
|
400
|
+
["update", "--project-id", "p", "--inherit", "email"],
|
|
401
|
+
["update", "--project-id", "p", "--inherit", "metadata", "--metadata", "{}"],
|
|
402
|
+
],
|
|
403
|
+
)
|
|
404
|
+
def test_invalid_views_and_inheritance_are_rejected_before_api_calls(args, client):
|
|
405
|
+
result = CliRunner().invoke(users.app, args)
|
|
406
|
+
assert result.exit_code == 2, result.output
|
|
407
|
+
assert not client.get_calls and not client.update_calls
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.53.2"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.53.
|
|
3
|
+
Version: 0.53.2
|
|
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.53.
|
|
26
|
-
Requires-Dist: meshagent-codex==0.53.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.53.2
|
|
26
|
+
Requires-Dist: meshagent-codex==0.53.2
|
|
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.53.
|
|
36
|
-
Requires-Dist: meshagent-api[all]==0.53.
|
|
37
|
-
Requires-Dist: meshagent-commoncrawl==0.53.
|
|
38
|
-
Requires-Dist: meshagent-scrapy==0.53.
|
|
39
|
-
Requires-Dist: meshagent-computers==0.53.
|
|
40
|
-
Requires-Dist: meshagent-openai==0.53.
|
|
41
|
-
Requires-Dist: meshagent-anthropic==0.53.
|
|
42
|
-
Requires-Dist: meshagent-otel==0.53.
|
|
43
|
-
Requires-Dist: meshagent-mcp==0.53.
|
|
44
|
-
Requires-Dist: meshagent-tools==0.53.
|
|
35
|
+
Requires-Dist: meshagent-agents[all]==0.53.2; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-api[all]==0.53.2; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-commoncrawl==0.53.2; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-scrapy==0.53.2; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-computers==0.53.2; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-openai==0.53.2; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-anthropic==0.53.2; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-otel==0.53.2; extra == "all"
|
|
43
|
+
Requires-Dist: meshagent-mcp==0.53.2; extra == "all"
|
|
44
|
+
Requires-Dist: meshagent-tools==0.53.2; 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.53.
|
|
49
|
-
Requires-Dist: meshagent-api==0.53.
|
|
50
|
-
Requires-Dist: meshagent-mcp==0.53.
|
|
51
|
-
Requires-Dist: meshagent-tools==0.53.
|
|
48
|
+
Requires-Dist: meshagent-agents[all]==0.53.2; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-api==0.53.2; extra == "mcp-service"
|
|
50
|
+
Requires-Dist: meshagent-mcp==0.53.2; extra == "mcp-service"
|
|
51
|
+
Requires-Dist: meshagent-tools==0.53.2; extra == "mcp-service"
|
|
52
52
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
53
53
|
Dynamic: license-file
|
|
54
54
|
|
|
@@ -11,8 +11,8 @@ openpyxl~=3.1
|
|
|
11
11
|
xlsxwriter~=3.2
|
|
12
12
|
pathspec<2,>=1.0.3
|
|
13
13
|
zstandard~=0.25.0
|
|
14
|
-
meshagent-llm-proxy==0.53.
|
|
15
|
-
meshagent-codex==0.53.
|
|
14
|
+
meshagent-llm-proxy==0.53.2
|
|
15
|
+
meshagent-codex==0.53.2
|
|
16
16
|
rich~=14.3.0
|
|
17
17
|
sounddevice~=0.5
|
|
18
18
|
textual<9.0,>=8.2.3
|
|
@@ -22,22 +22,22 @@ ascii-magic~=2.3
|
|
|
22
22
|
pillow~=11.3.0
|
|
23
23
|
|
|
24
24
|
[all]
|
|
25
|
-
meshagent-agents[all]==0.53.
|
|
26
|
-
meshagent-api[all]==0.53.
|
|
27
|
-
meshagent-commoncrawl==0.53.
|
|
28
|
-
meshagent-scrapy==0.53.
|
|
29
|
-
meshagent-computers==0.53.
|
|
30
|
-
meshagent-openai==0.53.
|
|
31
|
-
meshagent-anthropic==0.53.
|
|
32
|
-
meshagent-otel==0.53.
|
|
33
|
-
meshagent-mcp==0.53.
|
|
34
|
-
meshagent-tools==0.53.
|
|
25
|
+
meshagent-agents[all]==0.53.2
|
|
26
|
+
meshagent-api[all]==0.53.2
|
|
27
|
+
meshagent-commoncrawl==0.53.2
|
|
28
|
+
meshagent-scrapy==0.53.2
|
|
29
|
+
meshagent-computers==0.53.2
|
|
30
|
+
meshagent-openai==0.53.2
|
|
31
|
+
meshagent-anthropic==0.53.2
|
|
32
|
+
meshagent-otel==0.53.2
|
|
33
|
+
meshagent-mcp==0.53.2
|
|
34
|
+
meshagent-tools==0.53.2
|
|
35
35
|
supabase-auth~=2.28.0
|
|
36
36
|
prompt-toolkit~=3.0.52
|
|
37
37
|
|
|
38
38
|
[mcp-service]
|
|
39
|
-
meshagent-agents[all]==0.53.
|
|
40
|
-
meshagent-api==0.53.
|
|
41
|
-
meshagent-mcp==0.53.
|
|
42
|
-
meshagent-tools==0.53.
|
|
39
|
+
meshagent-agents[all]==0.53.2
|
|
40
|
+
meshagent-api==0.53.2
|
|
41
|
+
meshagent-mcp==0.53.2
|
|
42
|
+
meshagent-tools==0.53.2
|
|
43
43
|
supabase-auth~=2.28.0
|