meshagent-cli 0.46.0__tar.gz → 0.46.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.46.0 → meshagent_cli-0.46.2}/PKG-INFO +17 -17
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agents.py +1 -3
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agents_test.py +9 -6
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/projects.py +26 -43
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/projects_test.py +13 -8
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room.py +3 -5
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/routes.py +26 -1
- meshagent_cli-0.46.2/meshagent/cli/routes_test.py +119 -0
- meshagent_cli-0.46.2/meshagent/cli/sqlite.py +1017 -0
- meshagent_cli-0.46.2/meshagent/cli/sqlite_test.py +68 -0
- meshagent_cli-0.46.2/meshagent/cli/version.py +1 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/PKG-INFO +17 -17
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/SOURCES.txt +3 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/requires.txt +16 -16
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/pyproject.toml +16 -16
- meshagent_cli-0.46.0/meshagent/cli/version.py +0 -1
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/LICENSE +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/README.md +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/__init__.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/_filedrop.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agent.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agent_cli_options_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agent_package_cli.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/agent_package_cli_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/ask.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/ask_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/async_typer.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/async_typer_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/auth.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/auth_async.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/auth_async_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/auth_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/call.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/chatbot.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/cli.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/cli_mcp.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/cli_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/common_options.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/config.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/config_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/containers.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/containers_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/__init__.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/create_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/dataset.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/dataset_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/developer.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/developer_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/doctor.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/doctor_templates/__init__.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/doctor_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/feeds.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/helper.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/helper_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/helpers.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/host.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/iam.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/iam_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/image.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/image_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/launch.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/launch_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/llm.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/llm_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/local_settings.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/local_settings_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/mailbot.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/mailbot_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/mailboxes.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/meeting_transcriber.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/memory.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/memory_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/meshagent_images.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/meshagent_images_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/messaging.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/messaging_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/multi.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/oci_archive.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/oci_archive_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/participant_token.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/port.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/port_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/preamble_rules.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/preamble_rules_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/process.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/process_live_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/process_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/queue.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/queue_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/registry.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/registry_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room_connect.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room_connect_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room_services.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/room_services_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/rooms.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/rooms_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/root_commands.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/root_commands_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/scheduled_tasks.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/scheduled_tasks_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/secrets.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/secrets_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/service_accounts.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/service_accounts_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/services.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/services_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/sessions.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/sessions_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/storage.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/storage_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/subscriptions.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/sync.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/sync_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/task_runner.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/task_runner_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/testing.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/thread_inspect.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/thread_inspect_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/thread_sidebar.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tool_call_summary.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tool_call_summary_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tool_integrations.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tool_integrations_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/__init__.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/auth_switch.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/auth_switch_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/create.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/deploy_room.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/deploy_room_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/project_activate.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/project_activate_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/setup.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/setup_splash_frames.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/tui/setup_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/version_check.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/version_check_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/voicebot.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/webserver.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/webserver_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/worker.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent/cli/worker_test.py +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/dependency_links.txt +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/entry_points.txt +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/meshagent_cli.egg-info/top_level.txt +0 -0
- {meshagent_cli-0.46.0 → meshagent_cli-0.46.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.46.
|
|
3
|
+
Version: 0.46.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.46.
|
|
26
|
-
Requires-Dist: meshagent-codex==0.46.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.46.2
|
|
26
|
+
Requires-Dist: meshagent-codex==0.46.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.46.
|
|
36
|
-
Requires-Dist: meshagent-api[all]==0.46.
|
|
37
|
-
Requires-Dist: meshagent-commoncrawl==0.46.
|
|
38
|
-
Requires-Dist: meshagent-scrapy==0.46.
|
|
39
|
-
Requires-Dist: meshagent-computers==0.46.
|
|
40
|
-
Requires-Dist: meshagent-openai==0.46.
|
|
41
|
-
Requires-Dist: meshagent-anthropic==0.46.
|
|
42
|
-
Requires-Dist: meshagent-otel==0.46.
|
|
43
|
-
Requires-Dist: meshagent-mcp==0.46.
|
|
44
|
-
Requires-Dist: meshagent-tools==0.46.
|
|
35
|
+
Requires-Dist: meshagent-agents[all]==0.46.2; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-api[all]==0.46.2; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-commoncrawl==0.46.2; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-scrapy==0.46.2; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-computers==0.46.2; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-openai==0.46.2; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-anthropic==0.46.2; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-otel==0.46.2; extra == "all"
|
|
43
|
+
Requires-Dist: meshagent-mcp==0.46.2; extra == "all"
|
|
44
|
+
Requires-Dist: meshagent-tools==0.46.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.46.
|
|
49
|
-
Requires-Dist: meshagent-api==0.46.
|
|
50
|
-
Requires-Dist: meshagent-mcp==0.46.
|
|
51
|
-
Requires-Dist: meshagent-tools==0.46.
|
|
48
|
+
Requires-Dist: meshagent-agents[all]==0.46.2; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-api==0.46.2; extra == "mcp-service"
|
|
50
|
+
Requires-Dist: meshagent-mcp==0.46.2; extra == "mcp-service"
|
|
51
|
+
Requires-Dist: meshagent-tools==0.46.2; extra == "mcp-service"
|
|
52
52
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
53
53
|
Dynamic: license-file
|
|
54
54
|
|
|
@@ -609,9 +609,7 @@ async def agent_list_command(
|
|
|
609
609
|
project_id = await resolve_project_id(project_id=project_id)
|
|
610
610
|
agents = await account_client.list_agents(
|
|
611
611
|
project_id=project_id,
|
|
612
|
-
|
|
613
|
-
offset=offset,
|
|
614
|
-
order_by=order_by,
|
|
612
|
+
page_size=limit if limit is not None else count,
|
|
615
613
|
filter=filter,
|
|
616
614
|
)
|
|
617
615
|
output = [
|
|
@@ -64,17 +64,13 @@ class _FakeAgentClient:
|
|
|
64
64
|
self,
|
|
65
65
|
*,
|
|
66
66
|
project_id: str,
|
|
67
|
-
|
|
68
|
-
offset: int,
|
|
69
|
-
order_by: str,
|
|
67
|
+
page_size: int,
|
|
70
68
|
filter: str | None = None,
|
|
71
69
|
) -> list[ManagedAgent]:
|
|
72
70
|
self.list_agents_calls.append(
|
|
73
71
|
{
|
|
74
72
|
"project_id": project_id,
|
|
75
|
-
"
|
|
76
|
-
"offset": offset,
|
|
77
|
-
"order_by": order_by,
|
|
73
|
+
"page_size": page_size,
|
|
78
74
|
"filter": filter,
|
|
79
75
|
}
|
|
80
76
|
)
|
|
@@ -269,6 +265,13 @@ async def test_agent_list_command_outputs_current_agent_shape(
|
|
|
269
265
|
|
|
270
266
|
await agents.agent_list_command(project_id="project-1")
|
|
271
267
|
|
|
268
|
+
assert client.list_agents_calls == [
|
|
269
|
+
{
|
|
270
|
+
"project_id": "resolved-project",
|
|
271
|
+
"page_size": 100,
|
|
272
|
+
"filter": None,
|
|
273
|
+
}
|
|
274
|
+
]
|
|
272
275
|
assert printed == [
|
|
273
276
|
(
|
|
274
277
|
[
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import builtins
|
|
2
1
|
import sys
|
|
3
2
|
from dataclasses import dataclass
|
|
4
3
|
from typing import Annotated
|
|
@@ -6,7 +5,7 @@ from typing import Annotated
|
|
|
6
5
|
import typer
|
|
7
6
|
from rich import print
|
|
8
7
|
|
|
9
|
-
from meshagent.api.client import Meshagent, NotFoundError
|
|
8
|
+
from meshagent.api.client import Meshagent, NotFoundError, ProjectInfo, ProjectsPage
|
|
10
9
|
from meshagent.cli import async_typer
|
|
11
10
|
from meshagent.cli.helper import (
|
|
12
11
|
get_client,
|
|
@@ -27,35 +26,17 @@ class ListedProject:
|
|
|
27
26
|
|
|
28
27
|
|
|
29
28
|
def _parse_listed_projects(
|
|
30
|
-
response:
|
|
29
|
+
response: ProjectsPage,
|
|
31
30
|
*,
|
|
32
31
|
active_project_id: str | None,
|
|
33
32
|
) -> list[ListedProject]:
|
|
34
|
-
if not isinstance(response, dict):
|
|
35
|
-
return []
|
|
36
|
-
|
|
37
|
-
project_rows = response.get("projects")
|
|
38
|
-
if not isinstance(project_rows, builtins.list):
|
|
39
|
-
return []
|
|
40
|
-
|
|
41
33
|
selectable_projects: list[ListedProject] = []
|
|
42
|
-
for row in
|
|
43
|
-
|
|
44
|
-
continue
|
|
45
|
-
|
|
46
|
-
project_id = row.get("id")
|
|
47
|
-
if not isinstance(project_id, str):
|
|
48
|
-
continue
|
|
49
|
-
resolved_project_id = project_id.strip()
|
|
34
|
+
for row in response.projects:
|
|
35
|
+
resolved_project_id = row.id.strip()
|
|
50
36
|
if resolved_project_id == "":
|
|
51
37
|
continue
|
|
52
38
|
|
|
53
|
-
|
|
54
|
-
resolved_project_name = (
|
|
55
|
-
project_name.strip()
|
|
56
|
-
if isinstance(project_name, str) and project_name.strip() != ""
|
|
57
|
-
else resolved_project_id
|
|
58
|
-
)
|
|
39
|
+
resolved_project_name = row.name.strip() or resolved_project_id
|
|
59
40
|
|
|
60
41
|
selectable_projects.append(
|
|
61
42
|
ListedProject(
|
|
@@ -85,25 +66,18 @@ async def _create_project_id(
|
|
|
85
66
|
project_name: str,
|
|
86
67
|
) -> str:
|
|
87
68
|
created = await client.create_project(project_name)
|
|
88
|
-
|
|
89
|
-
raise RuntimeError("Project creation did not return a valid id.")
|
|
90
|
-
|
|
91
|
-
created_project_id = created.get("id")
|
|
92
|
-
if not isinstance(created_project_id, str):
|
|
93
|
-
raise RuntimeError("Project creation did not return a valid id.")
|
|
94
|
-
|
|
95
|
-
resolved_project_id = created_project_id.strip()
|
|
69
|
+
resolved_project_id = created.id.strip()
|
|
96
70
|
if resolved_project_id == "":
|
|
97
71
|
raise RuntimeError("Project creation did not return a valid id.")
|
|
98
72
|
|
|
99
73
|
return resolved_project_id
|
|
100
74
|
|
|
101
75
|
|
|
102
|
-
def _project_id_from_payload(project:
|
|
103
|
-
project_id = project.
|
|
104
|
-
if
|
|
76
|
+
def _project_id_from_payload(project: ProjectInfo) -> str:
|
|
77
|
+
project_id = project.id.strip()
|
|
78
|
+
if project_id == "":
|
|
105
79
|
raise RuntimeError("Project lookup did not return a valid id.")
|
|
106
|
-
return project_id
|
|
80
|
+
return project_id
|
|
107
81
|
|
|
108
82
|
|
|
109
83
|
async def _resolve_project_id_or_key(client: Meshagent, selector: str) -> str:
|
|
@@ -186,7 +160,7 @@ async def create(name: str):
|
|
|
186
160
|
client = await get_client()
|
|
187
161
|
try:
|
|
188
162
|
result = await client.create_project(name)
|
|
189
|
-
print(f"[green]Project created:[/] {result
|
|
163
|
+
print(f"[green]Project created:[/] {result.id}")
|
|
190
164
|
finally:
|
|
191
165
|
await client.close()
|
|
192
166
|
|
|
@@ -198,14 +172,18 @@ async def list(
|
|
|
198
172
|
client = await get_client()
|
|
199
173
|
projects = await client.list_projects()
|
|
200
174
|
active_project = await get_active_project()
|
|
201
|
-
|
|
175
|
+
output = [
|
|
176
|
+
project.model_dump(mode="json", exclude_none=True)
|
|
177
|
+
for project in projects.projects
|
|
178
|
+
]
|
|
179
|
+
for project in output:
|
|
202
180
|
if project["id"] == active_project:
|
|
203
|
-
project["name"] = "*" + project["name"]
|
|
181
|
+
project["name"] = "*" + str(project["name"])
|
|
204
182
|
|
|
205
183
|
if o == "json":
|
|
206
|
-
print(projects)
|
|
184
|
+
print({"projects": output})
|
|
207
185
|
else:
|
|
208
|
-
print_json_table(
|
|
186
|
+
print_json_table(output, "id", "name", "project_key")
|
|
209
187
|
await client.close()
|
|
210
188
|
|
|
211
189
|
|
|
@@ -219,9 +197,14 @@ async def get(
|
|
|
219
197
|
project_id = await _resolve_project_id_or_key(client, project)
|
|
220
198
|
project_info = await client.get_project(project_id)
|
|
221
199
|
if o == "json":
|
|
222
|
-
print(project_info)
|
|
200
|
+
print(project_info.model_dump(mode="json", exclude_none=True))
|
|
223
201
|
else:
|
|
224
|
-
print_json_table(
|
|
202
|
+
print_json_table(
|
|
203
|
+
[project_info.model_dump(mode="json", exclude_none=True)],
|
|
204
|
+
"id",
|
|
205
|
+
"name",
|
|
206
|
+
"project_key",
|
|
207
|
+
)
|
|
225
208
|
finally:
|
|
226
209
|
await client.close()
|
|
227
210
|
|
|
@@ -3,6 +3,7 @@ from types import SimpleNamespace
|
|
|
3
3
|
import pytest
|
|
4
4
|
|
|
5
5
|
from meshagent.api.client import NotFoundError
|
|
6
|
+
from meshagent.api.client import ProjectInfo, ProjectsPage
|
|
6
7
|
from meshagent.cli import projects
|
|
7
8
|
|
|
8
9
|
|
|
@@ -18,22 +19,26 @@ class _FakeClient:
|
|
|
18
19
|
self.created_project_names: list[str] = []
|
|
19
20
|
self.closed = False
|
|
20
21
|
|
|
21
|
-
async def list_projects(self) ->
|
|
22
|
-
return
|
|
22
|
+
async def list_projects(self) -> ProjectsPage:
|
|
23
|
+
return ProjectsPage(
|
|
24
|
+
projects=[
|
|
25
|
+
ProjectInfo.model_validate(project) for project in self._project_rows
|
|
26
|
+
]
|
|
27
|
+
)
|
|
23
28
|
|
|
24
|
-
async def get_project(self, project_id: str) ->
|
|
29
|
+
async def get_project(self, project_id: str) -> ProjectInfo:
|
|
25
30
|
for project in self._project_rows:
|
|
26
31
|
if project["id"] == project_id:
|
|
27
|
-
return project
|
|
32
|
+
return ProjectInfo.model_validate(project)
|
|
28
33
|
raise NotFoundError("not found")
|
|
29
34
|
|
|
30
|
-
async def get_project_by_key(self, project_key: str) ->
|
|
35
|
+
async def get_project_by_key(self, project_key: str) -> ProjectInfo:
|
|
31
36
|
for project in self._project_rows:
|
|
32
37
|
if project.get("project_key") == project_key:
|
|
33
|
-
return project
|
|
38
|
+
return ProjectInfo.model_validate(project)
|
|
34
39
|
raise NotFoundError("not found")
|
|
35
40
|
|
|
36
|
-
async def create_project(self, name: str) ->
|
|
41
|
+
async def create_project(self, name: str) -> ProjectInfo:
|
|
37
42
|
self.created_project_names.append(name)
|
|
38
43
|
created_row = {
|
|
39
44
|
"id": self._created_project_id,
|
|
@@ -41,7 +46,7 @@ class _FakeClient:
|
|
|
41
46
|
"project_key": name.lower().replace(" ", "-"),
|
|
42
47
|
}
|
|
43
48
|
self._project_rows.append(created_row)
|
|
44
|
-
return created_row
|
|
49
|
+
return ProjectInfo.model_validate(created_row)
|
|
45
50
|
|
|
46
51
|
async def close(self) -> None:
|
|
47
52
|
self.closed = True
|
|
@@ -51,11 +51,9 @@ app.add_lazy_command(
|
|
|
51
51
|
help="Manage dataset tables in a room",
|
|
52
52
|
)
|
|
53
53
|
app.add_lazy_command(
|
|
54
|
-
name="
|
|
55
|
-
module="meshagent.cli.
|
|
56
|
-
help="Manage
|
|
57
|
-
hidden=True,
|
|
58
|
-
deprecated=True,
|
|
54
|
+
name="sqlite",
|
|
55
|
+
module="meshagent.cli.sqlite",
|
|
56
|
+
help="Manage SQLite databases and tables in a room",
|
|
59
57
|
)
|
|
60
58
|
app.add_lazy_command(
|
|
61
59
|
name="memory",
|
|
@@ -74,6 +74,30 @@ def _warn_if_non_meshagent_app_domain(domain: str) -> None:
|
|
|
74
74
|
)
|
|
75
75
|
|
|
76
76
|
|
|
77
|
+
async def _list_routes_view(
|
|
78
|
+
client,
|
|
79
|
+
*,
|
|
80
|
+
project_id: str,
|
|
81
|
+
count: int,
|
|
82
|
+
offset: int,
|
|
83
|
+
filter: str | None,
|
|
84
|
+
):
|
|
85
|
+
routes = []
|
|
86
|
+
continuation_token: str | None = None
|
|
87
|
+
while len(routes) < offset + count:
|
|
88
|
+
page = await client.list_routes_page(
|
|
89
|
+
project_id=project_id,
|
|
90
|
+
page_size=min(max(offset + count - len(routes), 1), 100),
|
|
91
|
+
continuation_token=continuation_token,
|
|
92
|
+
filter=filter,
|
|
93
|
+
)
|
|
94
|
+
routes.extend(page.routes)
|
|
95
|
+
continuation_token = page.continuation_token
|
|
96
|
+
if continuation_token is None:
|
|
97
|
+
break
|
|
98
|
+
return routes[offset : offset + count]
|
|
99
|
+
|
|
100
|
+
|
|
77
101
|
@app.async_command("create")
|
|
78
102
|
async def route_create(
|
|
79
103
|
*,
|
|
@@ -317,7 +341,8 @@ async def route_list(
|
|
|
317
341
|
filter=filter,
|
|
318
342
|
)
|
|
319
343
|
else:
|
|
320
|
-
routes = await
|
|
344
|
+
routes = await _list_routes_view(
|
|
345
|
+
client,
|
|
321
346
|
project_id=project_id,
|
|
322
347
|
count=count,
|
|
323
348
|
offset=offset,
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from meshagent.api.client import Route, RoutesPage
|
|
4
|
+
from meshagent.cli import routes
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class _FakeRoutesClient:
|
|
8
|
+
def __init__(self) -> None:
|
|
9
|
+
self.closed = False
|
|
10
|
+
self.list_routes_page_calls: list[dict[str, object]] = []
|
|
11
|
+
self.list_routes_calls: list[dict[str, object]] = []
|
|
12
|
+
self.pages = [
|
|
13
|
+
RoutesPage(
|
|
14
|
+
routes=[
|
|
15
|
+
Route.model_validate(
|
|
16
|
+
{
|
|
17
|
+
"domain": "a.meshagent.app",
|
|
18
|
+
"room_name": "room-a",
|
|
19
|
+
"port": "8080",
|
|
20
|
+
}
|
|
21
|
+
),
|
|
22
|
+
Route.model_validate(
|
|
23
|
+
{
|
|
24
|
+
"domain": "b.meshagent.app",
|
|
25
|
+
"room_name": "room-b",
|
|
26
|
+
"port": "8081",
|
|
27
|
+
}
|
|
28
|
+
),
|
|
29
|
+
],
|
|
30
|
+
continuation_token="next",
|
|
31
|
+
),
|
|
32
|
+
RoutesPage(
|
|
33
|
+
routes=[
|
|
34
|
+
Route.model_validate(
|
|
35
|
+
{
|
|
36
|
+
"domain": "c.meshagent.app",
|
|
37
|
+
"room_name": "room-c",
|
|
38
|
+
"port": "8082",
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
],
|
|
42
|
+
continuation_token=None,
|
|
43
|
+
),
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
async def list_routes_page(
|
|
47
|
+
self,
|
|
48
|
+
*,
|
|
49
|
+
project_id: str,
|
|
50
|
+
page_size: int,
|
|
51
|
+
continuation_token: str | None = None,
|
|
52
|
+
filter: str | None = None,
|
|
53
|
+
) -> RoutesPage:
|
|
54
|
+
self.list_routes_page_calls.append(
|
|
55
|
+
{
|
|
56
|
+
"project_id": project_id,
|
|
57
|
+
"page_size": page_size,
|
|
58
|
+
"continuation_token": continuation_token,
|
|
59
|
+
"filter": filter,
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
return self.pages.pop(0)
|
|
63
|
+
|
|
64
|
+
async def list_routes(self, **kwargs):
|
|
65
|
+
self.list_routes_calls.append(kwargs)
|
|
66
|
+
raise AssertionError("route_list should use list_routes_page for pagination")
|
|
67
|
+
|
|
68
|
+
async def close(self) -> None:
|
|
69
|
+
self.closed = True
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@pytest.mark.asyncio
|
|
73
|
+
async def test_route_list_without_room_uses_paged_routes_client(
|
|
74
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
75
|
+
) -> None:
|
|
76
|
+
client = _FakeRoutesClient()
|
|
77
|
+
printed: list[object] = []
|
|
78
|
+
|
|
79
|
+
async def fake_get_client() -> _FakeRoutesClient:
|
|
80
|
+
return client
|
|
81
|
+
|
|
82
|
+
async def fake_resolve_project_id(project_id: str | None = None) -> str:
|
|
83
|
+
assert project_id == "project-1"
|
|
84
|
+
return "resolved-project"
|
|
85
|
+
|
|
86
|
+
monkeypatch.setattr(routes, "get_client", fake_get_client)
|
|
87
|
+
monkeypatch.setattr(routes, "resolve_project_id", fake_resolve_project_id)
|
|
88
|
+
monkeypatch.setattr(routes, "resolve_room", lambda room=None: room)
|
|
89
|
+
monkeypatch.setattr(routes, "print", printed.append)
|
|
90
|
+
|
|
91
|
+
await routes.route_list(
|
|
92
|
+
project_id="project-1",
|
|
93
|
+
count=2,
|
|
94
|
+
offset=1,
|
|
95
|
+
filter="mesh",
|
|
96
|
+
o="json",
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
assert client.list_routes_calls == []
|
|
100
|
+
assert client.list_routes_page_calls == [
|
|
101
|
+
{
|
|
102
|
+
"project_id": "resolved-project",
|
|
103
|
+
"page_size": 3,
|
|
104
|
+
"continuation_token": None,
|
|
105
|
+
"filter": "mesh",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"project_id": "resolved-project",
|
|
109
|
+
"page_size": 1,
|
|
110
|
+
"continuation_token": "next",
|
|
111
|
+
"filter": "mesh",
|
|
112
|
+
},
|
|
113
|
+
]
|
|
114
|
+
assert client.closed
|
|
115
|
+
assert len(printed) == 1
|
|
116
|
+
assert [route["domain"] for route in printed[0]["routes"]] == [
|
|
117
|
+
"b.meshagent.app",
|
|
118
|
+
"c.meshagent.app",
|
|
119
|
+
]
|