meshagent-cli 0.41.9__tar.gz → 0.42.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.41.9 → meshagent_cli-0.42.2}/PKG-INFO +16 -16
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/ask.py +1 -1
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/ask_test.py +20 -10
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/containers.py +2 -1
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/containers_test.py +7 -2
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/create.py +1 -1
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/create_test.py +96 -6
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/image.py +672 -85
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/image_test.py +734 -48
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/local_settings_test.py +2 -2
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/meshagent_images.py +3 -1
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/meshagent_images_test.py +28 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/projects.py +36 -19
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/projects_test.py +46 -1
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/rooms.py +39 -8
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/rooms_test.py +87 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/deploy_room.py +139 -13
- meshagent_cli-0.42.2/meshagent/cli/tui/deploy_room_test.py +272 -0
- meshagent_cli-0.42.2/meshagent/cli/version.py +1 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent_cli.egg-info/PKG-INFO +16 -16
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent_cli.egg-info/requires.txt +15 -15
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/pyproject.toml +15 -15
- meshagent_cli-0.41.9/meshagent/cli/tui/deploy_room_test.py +0 -61
- meshagent_cli-0.41.9/meshagent/cli/version.py +0 -1
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/LICENSE +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/README.md +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/__init__.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/agent.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/agent_cli_options_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/agent_package_cli.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/agent_package_cli_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/agents.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/agents_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/api_keys.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/api_keys_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/async_typer.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/async_typer_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/auth.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/auth_async.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/auth_async_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/auth_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/call.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/chatbot.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/cli.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/cli_mcp.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/cli_secrets.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/cli_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/common_options.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/config.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/config_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/create_project_templates/__init__.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/dataset.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/dataset_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/developer.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/developer_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/doctor.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/doctor_templates/__init__.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/doctor_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/feeds.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/helper.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/helper_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/helpers.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/host.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/launch.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/launch_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/llm.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/llm_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/local_settings.py +4 -4
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/mailbot.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/mailbot_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/mailboxes.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/meeting_transcriber.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/memory.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/memory_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/messaging.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/multi.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/oauth2.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/oauth2_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/oci_archive.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/oci_archive_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/participant_token.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/port.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/port_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/preamble_rules.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/preamble_rules_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/process.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/process_live_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/process_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/queue.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/queue_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/registry.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/registry_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/room.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/room_connect.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/room_connect_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/room_services.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/root_commands.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/root_commands_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/routes.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/scheduled_tasks.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/scheduled_tasks_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/services.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/services_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/sessions.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/sessions_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/storage.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/storage_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/subscriptions.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/sync.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/sync_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/task_runner.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/task_runner_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tool_call_summary.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tool_call_summary_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tool_integrations.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tool_integrations_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/__init__.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/auth_switch.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/auth_switch_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/create.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/project_activate.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/project_activate_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/setup.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/setup_splash_frames.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/tui/setup_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/version_check.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/version_check_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/voicebot.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/webhook.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/webserver.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/webserver_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/worker.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent/cli/worker_test.py +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent_cli.egg-info/SOURCES.txt +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent_cli.egg-info/dependency_links.txt +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent_cli.egg-info/entry_points.txt +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/meshagent_cli.egg-info/top_level.txt +0 -0
- {meshagent_cli-0.41.9 → meshagent_cli-0.42.2}/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.42.2
|
|
4
4
|
Summary: CLI for Meshagent
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Documentation, https://docs.meshagent.com
|
|
@@ -22,7 +22,7 @@ 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.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.42.2
|
|
26
26
|
Requires-Dist: rich~=14.3.0
|
|
27
27
|
Requires-Dist: sounddevice~=0.5
|
|
28
28
|
Requires-Dist: textual<9.0,>=8.2.3
|
|
@@ -30,23 +30,23 @@ Requires-Dist: prompt-toolkit~=3.0.52
|
|
|
30
30
|
Requires-Dist: ascii-magic~=2.3
|
|
31
31
|
Requires-Dist: pillow~=11.3.0
|
|
32
32
|
Provides-Extra: all
|
|
33
|
-
Requires-Dist: meshagent-agents[all]==0.
|
|
34
|
-
Requires-Dist: meshagent-api[all]==0.
|
|
35
|
-
Requires-Dist: meshagent-commoncrawl==0.
|
|
36
|
-
Requires-Dist: meshagent-scrapy==0.
|
|
37
|
-
Requires-Dist: meshagent-computers==0.
|
|
38
|
-
Requires-Dist: meshagent-openai==0.
|
|
39
|
-
Requires-Dist: meshagent-anthropic==0.
|
|
40
|
-
Requires-Dist: meshagent-otel==0.
|
|
41
|
-
Requires-Dist: meshagent-mcp==0.
|
|
42
|
-
Requires-Dist: meshagent-tools==0.
|
|
33
|
+
Requires-Dist: meshagent-agents[all]==0.42.2; extra == "all"
|
|
34
|
+
Requires-Dist: meshagent-api[all]==0.42.2; extra == "all"
|
|
35
|
+
Requires-Dist: meshagent-commoncrawl==0.42.2; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-scrapy==0.42.2; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-computers==0.42.2; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-openai==0.42.2; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-anthropic==0.42.2; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-otel==0.42.2; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-mcp==0.42.2; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-tools==0.42.2; extra == "all"
|
|
43
43
|
Requires-Dist: supabase-auth~=2.28.0; extra == "all"
|
|
44
44
|
Requires-Dist: prompt-toolkit~=3.0.52; extra == "all"
|
|
45
45
|
Provides-Extra: mcp-service
|
|
46
|
-
Requires-Dist: meshagent-agents[all]==0.
|
|
47
|
-
Requires-Dist: meshagent-api==0.
|
|
48
|
-
Requires-Dist: meshagent-mcp==0.
|
|
49
|
-
Requires-Dist: meshagent-tools==0.
|
|
46
|
+
Requires-Dist: meshagent-agents[all]==0.42.2; extra == "mcp-service"
|
|
47
|
+
Requires-Dist: meshagent-api==0.42.2; extra == "mcp-service"
|
|
48
|
+
Requires-Dist: meshagent-mcp==0.42.2; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-tools==0.42.2; extra == "mcp-service"
|
|
50
50
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
51
51
|
Dynamic: license-file
|
|
52
52
|
|
|
@@ -3891,7 +3891,7 @@ async def ask(
|
|
|
3891
3891
|
help="Output format for non-interactive responses.",
|
|
3892
3892
|
case_sensitive=False,
|
|
3893
3893
|
),
|
|
3894
|
-
] = "
|
|
3894
|
+
] = "markdown",
|
|
3895
3895
|
model: Annotated[
|
|
3896
3896
|
str,
|
|
3897
3897
|
typer.Option("--model", help="Name of the LLM model to use"),
|
|
@@ -1227,9 +1227,11 @@ async def test_resolve_ask_access_token_prefers_meshagent_token(monkeypatch) ->
|
|
|
1227
1227
|
|
|
1228
1228
|
|
|
1229
1229
|
@pytest.mark.asyncio
|
|
1230
|
-
async def
|
|
1230
|
+
async def test_ask_command_uses_oauth_token_and_renders_markdown_by_default(
|
|
1231
|
+
monkeypatch,
|
|
1232
|
+
) -> None:
|
|
1231
1233
|
captured: dict[str, object] = {}
|
|
1232
|
-
|
|
1234
|
+
rendered: list[object] = []
|
|
1233
1235
|
|
|
1234
1236
|
async def _fake_get_access_token() -> str:
|
|
1235
1237
|
return "oauth-token"
|
|
@@ -1255,10 +1257,19 @@ async def test_ask_command_uses_oauth_token_and_prints_result(monkeypatch) -> No
|
|
|
1255
1257
|
monkeypatch.setattr(ask_module, "resolve_project_id", _fake_resolve_project_id)
|
|
1256
1258
|
monkeypatch.setattr(ask_module, "_build_ask_adapter", _fake_build_ask_adapter)
|
|
1257
1259
|
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
+
class _FakeConsole:
|
|
1261
|
+
def print(self, value: object) -> None:
|
|
1262
|
+
rendered.append(value)
|
|
1260
1263
|
|
|
1261
|
-
monkeypatch.setattr(ask_module
|
|
1264
|
+
monkeypatch.setattr(ask_module, "Console", _FakeConsole)
|
|
1265
|
+
monkeypatch.setattr(ask_module, "Markdown", lambda text: ("markdown", text))
|
|
1266
|
+
monkeypatch.setattr(
|
|
1267
|
+
ask_module.click,
|
|
1268
|
+
"echo",
|
|
1269
|
+
lambda *args, **kwargs: (_ for _ in ()).throw(
|
|
1270
|
+
AssertionError("streaming output should not be used")
|
|
1271
|
+
),
|
|
1272
|
+
)
|
|
1262
1273
|
|
|
1263
1274
|
await ask_module.ask(
|
|
1264
1275
|
project_id="project-123",
|
|
@@ -1271,11 +1282,7 @@ async def test_ask_command_uses_oauth_token_and_prints_result(monkeypatch) -> No
|
|
|
1271
1282
|
"project_id": "project-123",
|
|
1272
1283
|
"access_token": "oauth-token",
|
|
1273
1284
|
}
|
|
1274
|
-
assert
|
|
1275
|
-
(("hello",), {"nl": False}),
|
|
1276
|
-
((" world",), {"nl": False}),
|
|
1277
|
-
((), {}),
|
|
1278
|
-
]
|
|
1285
|
+
assert rendered == [("markdown", "hello world")]
|
|
1279
1286
|
|
|
1280
1287
|
|
|
1281
1288
|
def test_meshagent_ask_cli_invocation_prints_streamed_response(
|
|
@@ -1311,6 +1318,8 @@ def test_meshagent_ask_cli_invocation_prints_streamed_response(
|
|
|
1311
1318
|
"project-123",
|
|
1312
1319
|
"--message",
|
|
1313
1320
|
"hello",
|
|
1321
|
+
"--format",
|
|
1322
|
+
"text",
|
|
1314
1323
|
"--model",
|
|
1315
1324
|
"gpt-5.5",
|
|
1316
1325
|
],
|
|
@@ -1603,6 +1612,7 @@ async def test_ask_command_prefers_meshagent_token_over_oauth(monkeypatch) -> No
|
|
|
1603
1612
|
await ask_module.ask(
|
|
1604
1613
|
project_id="project-123",
|
|
1605
1614
|
message="hello",
|
|
1615
|
+
format="text",
|
|
1606
1616
|
model="gpt-5.5",
|
|
1607
1617
|
)
|
|
1608
1618
|
|
|
@@ -30,6 +30,7 @@ from meshagent.cli.helper import (
|
|
|
30
30
|
split_container_mount,
|
|
31
31
|
split_image_mount,
|
|
32
32
|
)
|
|
33
|
+
from meshagent.api.helpers import websocket_room_url
|
|
33
34
|
from meshagent.api import (
|
|
34
35
|
RoomClient,
|
|
35
36
|
WebSocketClientProtocol,
|
|
@@ -555,7 +556,7 @@ async def _with_client(
|
|
|
555
556
|
connection = await account_client.connect_room(project_id=project_id, room=room)
|
|
556
557
|
|
|
557
558
|
proto = WebSocketClientProtocol(
|
|
558
|
-
url=
|
|
559
|
+
url=websocket_room_url(room_name=room),
|
|
559
560
|
token=connection.jwt,
|
|
560
561
|
)
|
|
561
562
|
client_cm = RoomClient(protocol_factory=proto.create_factory())
|
|
@@ -522,7 +522,7 @@ async def test_images_inspect_renders_detail_tables(
|
|
|
522
522
|
|
|
523
523
|
|
|
524
524
|
@pytest.mark.asyncio
|
|
525
|
-
async def
|
|
525
|
+
async def test_with_client_uses_configured_websocket_room_url(
|
|
526
526
|
monkeypatch: pytest.MonkeyPatch,
|
|
527
527
|
) -> None:
|
|
528
528
|
connection = SimpleNamespace(
|
|
@@ -560,6 +560,11 @@ async def test_with_client_uses_room_url_from_connection_info(
|
|
|
560
560
|
monkeypatch.setattr(containers, "get_client", _fake_get_client)
|
|
561
561
|
monkeypatch.setattr(containers, "resolve_project_id", _fake_resolve_project_id)
|
|
562
562
|
monkeypatch.setattr(containers, "resolve_room", lambda room: f"{room}-resolved")
|
|
563
|
+
monkeypatch.setattr(
|
|
564
|
+
containers,
|
|
565
|
+
"websocket_room_url",
|
|
566
|
+
lambda room_name: f"wss://configured-router/{room_name}",
|
|
567
|
+
)
|
|
563
568
|
monkeypatch.setattr(containers, "WebSocketClientProtocol", _FakeProtocol)
|
|
564
569
|
monkeypatch.setattr(containers, "RoomClient", _FakeRoomClient)
|
|
565
570
|
|
|
@@ -574,7 +579,7 @@ async def test_with_client_uses_room_url_from_connection_info(
|
|
|
574
579
|
]
|
|
575
580
|
assert protocol_calls == [
|
|
576
581
|
{
|
|
577
|
-
"url": "wss://
|
|
582
|
+
"url": "wss://configured-router/room-1-resolved",
|
|
578
583
|
"token": "jwt-token",
|
|
579
584
|
}
|
|
580
585
|
]
|
|
@@ -129,7 +129,7 @@ NPM_CHATBOT_UI_NEXT_STEPS = (
|
|
|
129
129
|
)
|
|
130
130
|
CONTACT_FORM_NEXT_STEPS = (
|
|
131
131
|
"./scripts/install.sh",
|
|
132
|
-
"meshagent rooms create
|
|
132
|
+
"meshagent rooms create <room> --if-not-exists",
|
|
133
133
|
"./scripts/dev.sh --room <room>",
|
|
134
134
|
"CONTACT_FORM_TO=you@example.com ./scripts/deploy.sh --room <room>",
|
|
135
135
|
)
|
|
@@ -2,11 +2,46 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from click.testing import CliRunner
|
|
4
4
|
|
|
5
|
+
from meshagent.api.specs.service import ServiceTemplateSpec
|
|
5
6
|
from meshagent.cli import create as create_module
|
|
6
7
|
from meshagent.cli.doctor import diagnose_project
|
|
7
8
|
from meshagent.cli.create import create_command
|
|
8
9
|
|
|
9
10
|
|
|
11
|
+
def _assert_runtime_image_mount_deploy_yaml(
|
|
12
|
+
project_path,
|
|
13
|
+
*,
|
|
14
|
+
runtime: str,
|
|
15
|
+
command: str,
|
|
16
|
+
) -> ServiceTemplateSpec:
|
|
17
|
+
deploy_yaml = (project_path / ".meshagent" / "deploy.yaml").read_text(
|
|
18
|
+
encoding="utf-8"
|
|
19
|
+
)
|
|
20
|
+
spec = ServiceTemplateSpec.from_yaml(
|
|
21
|
+
deploy_yaml,
|
|
22
|
+
values={
|
|
23
|
+
"image": "registry.example.com/test-app:dev",
|
|
24
|
+
"from_email": "from@example.com",
|
|
25
|
+
"to_email": "to@example.com",
|
|
26
|
+
},
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
assert spec.container is not None
|
|
30
|
+
container = spec.container
|
|
31
|
+
assert container.image == f"meshagent/{runtime}:default"
|
|
32
|
+
assert container.command == command
|
|
33
|
+
assert container.working_dir == "/app"
|
|
34
|
+
assert container.storage is not None
|
|
35
|
+
assert container.storage.images is not None
|
|
36
|
+
assert len(container.storage.images) == 1
|
|
37
|
+
image_mount = container.storage.images[0]
|
|
38
|
+
assert image_mount.image == "registry.example.com/test-app:dev"
|
|
39
|
+
assert image_mount.path == "/app"
|
|
40
|
+
assert image_mount.subpath == "app"
|
|
41
|
+
assert image_mount.read_only is True
|
|
42
|
+
return spec
|
|
43
|
+
|
|
44
|
+
|
|
10
45
|
def _assert_node_content_toolkit(
|
|
11
46
|
source: str,
|
|
12
47
|
*,
|
|
@@ -133,6 +168,11 @@ def test_init_creates_python_backend_agent_by_default_in_non_tty(tmp_path) -> No
|
|
|
133
168
|
assert "LABEL meshagent.runtime=python" in dockerfile
|
|
134
169
|
assert 'CMD ["-m", "server"]' in dockerfile
|
|
135
170
|
assert "EXPOSE" not in dockerfile
|
|
171
|
+
_assert_runtime_image_mount_deploy_yaml(
|
|
172
|
+
tmp_path,
|
|
173
|
+
runtime="python",
|
|
174
|
+
command="python -m server",
|
|
175
|
+
)
|
|
136
176
|
assert 'PYTHON="${PYTHON:-python3.13}"' in install_sh
|
|
137
177
|
assert 'VENV="${VENV:-.venv}"' in install_sh
|
|
138
178
|
assert 'PIP_ONLY_BINARY="${PIP_ONLY_BINARY:-:all:}"' in install_sh
|
|
@@ -284,6 +324,11 @@ def test_init_creates_python_webserver_non_interactively(tmp_path) -> None:
|
|
|
284
324
|
assert "FROM scratch" in dockerfile
|
|
285
325
|
assert "LABEL meshagent.runtime=python" in dockerfile
|
|
286
326
|
assert "EXPOSE 8000" in dockerfile
|
|
327
|
+
_assert_runtime_image_mount_deploy_yaml(
|
|
328
|
+
tmp_path,
|
|
329
|
+
runtime="python",
|
|
330
|
+
command="python -m server",
|
|
331
|
+
)
|
|
287
332
|
assert 'PYTHON="${PYTHON:-python3.13}"' in install_sh
|
|
288
333
|
assert 'VENV="${VENV:-.venv}"' in install_sh
|
|
289
334
|
assert 'PIP_ONLY_BINARY="${PIP_ONLY_BINARY:-:all:}"' in install_sh
|
|
@@ -317,7 +362,7 @@ def test_init_creates_python_contact_form_non_interactively(tmp_path) -> None:
|
|
|
317
362
|
assert "2. Create room" in result.output
|
|
318
363
|
assert "3. Run locally" in result.output
|
|
319
364
|
assert "4. Deploy" in result.output
|
|
320
|
-
assert "meshagent rooms create
|
|
365
|
+
assert "meshagent rooms create <room> --if-not-exists" in result.output
|
|
321
366
|
assert (
|
|
322
367
|
"Before testing a submission, set up the sender mailbox for that room"
|
|
323
368
|
in result.output
|
|
@@ -354,7 +399,7 @@ def test_init_creates_python_contact_form_non_interactively(tmp_path) -> None:
|
|
|
354
399
|
deploy_yaml = (tmp_path / ".meshagent" / "deploy.yaml").read_text(encoding="utf-8")
|
|
355
400
|
|
|
356
401
|
assert "Python Contact Form" in readme
|
|
357
|
-
assert "meshagent rooms create
|
|
402
|
+
assert "meshagent rooms create <room> --if-not-exists" in readme
|
|
358
403
|
assert "./scripts/dev.sh --room <room>" in readme
|
|
359
404
|
assert "CONTACT_FORM_TO=you@example.com ./scripts/deploy.sh --room <room>" in readme
|
|
360
405
|
assert (
|
|
@@ -389,6 +434,11 @@ def test_init_creates_python_contact_form_non_interactively(tmp_path) -> None:
|
|
|
389
434
|
assert "FROM scratch" in dockerfile
|
|
390
435
|
assert "LABEL meshagent.runtime=python" in dockerfile
|
|
391
436
|
assert "EXPOSE 8000" in dockerfile
|
|
437
|
+
_assert_runtime_image_mount_deploy_yaml(
|
|
438
|
+
tmp_path,
|
|
439
|
+
runtime="python",
|
|
440
|
+
command="python -m server",
|
|
441
|
+
)
|
|
392
442
|
assert 'PYTHON="${PYTHON:-python3.13}"' in install_sh
|
|
393
443
|
assert 'VENV="${VENV:-.venv}"' in install_sh
|
|
394
444
|
assert 'PIP_ONLY_BINARY="${PIP_ONLY_BINARY:-:all:}"' in install_sh
|
|
@@ -403,13 +453,13 @@ def test_init_creates_python_contact_form_non_interactively(tmp_path) -> None:
|
|
|
403
453
|
assert "CONTACT_FORM_OPEN_BROWSER" in dev_sh
|
|
404
454
|
assert "CONTACT_FORM_OPEN_BROWSER_PROMPT" not in dev_sh
|
|
405
455
|
assert "read -r OPEN_BROWSER_ANSWER" not in dev_sh
|
|
406
|
-
assert 'meshagent rooms create
|
|
456
|
+
assert 'meshagent rooms create "$ROOM_NAME" --if-not-exists' in dev_sh
|
|
407
457
|
assert 'meshagent room connect "$@" -- "$VENV_PYTHON" -u server.py' in dev_sh
|
|
408
458
|
assert 'if [ "$status" -eq 130 ] || [ "$status" -eq 143 ]; then' in dev_sh
|
|
409
459
|
assert "Stopped contact form." in dev_sh
|
|
410
460
|
assert "If the room does not exist yet, create it first:" in dev_sh
|
|
411
|
-
assert "meshagent rooms create
|
|
412
|
-
assert 'meshagent rooms create
|
|
461
|
+
assert "meshagent rooms create <room> --if-not-exists" in dev_sh
|
|
462
|
+
assert 'meshagent rooms create "$ROOM_NAME" --if-not-exists' not in deploy_sh
|
|
413
463
|
assert "--meshagent-token agentDefault" in deploy_sh
|
|
414
464
|
assert '--set "from_email=$CONTACT_FORM_FROM"' in deploy_sh
|
|
415
465
|
assert '--set "to_email=$CONTACT_FORM_TO"' in deploy_sh
|
|
@@ -497,6 +547,11 @@ def test_init_creates_javascript_webserver_non_interactively(tmp_path) -> None:
|
|
|
497
547
|
assert "FROM scratch" in dockerfile_text
|
|
498
548
|
assert "LABEL meshagent.runtime=node" in dockerfile_text
|
|
499
549
|
assert "EXPOSE 3000" in dockerfile_text
|
|
550
|
+
_assert_runtime_image_mount_deploy_yaml(
|
|
551
|
+
tmp_path,
|
|
552
|
+
runtime="node",
|
|
553
|
+
command="node index.js",
|
|
554
|
+
)
|
|
500
555
|
|
|
501
556
|
|
|
502
557
|
def test_init_creates_javascript_backend_agent_non_interactively(tmp_path) -> None:
|
|
@@ -547,6 +602,11 @@ def test_init_creates_javascript_backend_agent_non_interactively(tmp_path) -> No
|
|
|
547
602
|
assert "FROM scratch" in dockerfile
|
|
548
603
|
assert "LABEL meshagent.runtime=node" in dockerfile
|
|
549
604
|
assert "EXPOSE" not in dockerfile
|
|
605
|
+
_assert_runtime_image_mount_deploy_yaml(
|
|
606
|
+
tmp_path,
|
|
607
|
+
runtime="node",
|
|
608
|
+
command="node index.js",
|
|
609
|
+
)
|
|
550
610
|
|
|
551
611
|
|
|
552
612
|
def test_init_creates_typescript_webserver_non_interactively(tmp_path) -> None:
|
|
@@ -609,6 +669,11 @@ def test_init_creates_typescript_webserver_non_interactively(tmp_path) -> None:
|
|
|
609
669
|
assert "FROM scratch" in dockerfile_text
|
|
610
670
|
assert "LABEL meshagent.runtime=node" in dockerfile_text
|
|
611
671
|
assert "EXPOSE 3000" in dockerfile_text
|
|
672
|
+
_assert_runtime_image_mount_deploy_yaml(
|
|
673
|
+
tmp_path,
|
|
674
|
+
runtime="node",
|
|
675
|
+
command="node index.js",
|
|
676
|
+
)
|
|
612
677
|
assert diagnosis.language == "TypeScript"
|
|
613
678
|
assert diagnosis.javascript_flavor == "Node.js/TypeScript"
|
|
614
679
|
assert diagnosis.sdk == "@meshagent/meshagent"
|
|
@@ -661,6 +726,11 @@ def test_init_creates_typescript_backend_agent_non_interactively(tmp_path) -> No
|
|
|
661
726
|
assert "FROM scratch" in dockerfile
|
|
662
727
|
assert "LABEL meshagent.runtime=node" in dockerfile
|
|
663
728
|
assert "EXPOSE" not in dockerfile
|
|
729
|
+
_assert_runtime_image_mount_deploy_yaml(
|
|
730
|
+
tmp_path,
|
|
731
|
+
runtime="node",
|
|
732
|
+
command="node index.js",
|
|
733
|
+
)
|
|
664
734
|
assert diagnosis.language == "TypeScript"
|
|
665
735
|
assert diagnosis.javascript_flavor == "Node.js/TypeScript"
|
|
666
736
|
assert diagnosis.sdk == "@meshagent/meshagent"
|
|
@@ -727,6 +797,11 @@ def test_init_creates_typescript_chatbot_non_interactively(tmp_path) -> None:
|
|
|
727
797
|
assert "FROM scratch" in dockerfile
|
|
728
798
|
assert "LABEL meshagent.runtime=node" in dockerfile
|
|
729
799
|
assert "EXPOSE 3000" in dockerfile
|
|
800
|
+
_assert_runtime_image_mount_deploy_yaml(
|
|
801
|
+
tmp_path,
|
|
802
|
+
runtime="node",
|
|
803
|
+
command="node index.js",
|
|
804
|
+
)
|
|
730
805
|
assert diagnosis.language == "TypeScript"
|
|
731
806
|
assert diagnosis.javascript_flavor == "Node.js/TypeScript"
|
|
732
807
|
assert diagnosis.sdk is None
|
|
@@ -804,6 +879,11 @@ def test_init_creates_typescript_anthropic_chatbot_non_interactively(
|
|
|
804
879
|
assert "FROM scratch" in dockerfile
|
|
805
880
|
assert "LABEL meshagent.runtime=node" in dockerfile
|
|
806
881
|
assert "EXPOSE 3000" in dockerfile
|
|
882
|
+
_assert_runtime_image_mount_deploy_yaml(
|
|
883
|
+
tmp_path,
|
|
884
|
+
runtime="node",
|
|
885
|
+
command="node index.js",
|
|
886
|
+
)
|
|
807
887
|
assert diagnosis.language == "TypeScript"
|
|
808
888
|
assert diagnosis.javascript_flavor == "Node.js/TypeScript"
|
|
809
889
|
assert diagnosis.sdk is None
|
|
@@ -966,7 +1046,7 @@ def test_init_creates_typescript_chatbot_ui_non_interactively(tmp_path) -> None:
|
|
|
966
1046
|
assert '"build": "next build"' in package_json
|
|
967
1047
|
assert '"start": "node .next/standalone/server.js"' in package_json
|
|
968
1048
|
assert (
|
|
969
|
-
'"deploy": "meshagent deploy . --tag meshagent-create-typescript-chatbot-ui:dev --private --validation-mode=cookie --extra-port=
|
|
1049
|
+
'"deploy": "meshagent deploy . --tag meshagent-create-typescript-chatbot-ui:dev --private --validation-mode=cookie --extra-port=assistant:/messages --liveness /health --wait"'
|
|
970
1050
|
in package_json
|
|
971
1051
|
)
|
|
972
1052
|
assert 'from "@msgpack/msgpack"' in page_tsx
|
|
@@ -983,6 +1063,16 @@ def test_init_creates_typescript_chatbot_ui_non_interactively(tmp_path) -> None:
|
|
|
983
1063
|
assert 'CMD ["server.js"]' in dockerfile
|
|
984
1064
|
assert "ENV HOSTNAME=0.0.0.0" in dockerfile
|
|
985
1065
|
assert "EXPOSE 3000" in dockerfile
|
|
1066
|
+
spec = _assert_runtime_image_mount_deploy_yaml(
|
|
1067
|
+
tmp_path,
|
|
1068
|
+
runtime="node",
|
|
1069
|
+
command="node server.js",
|
|
1070
|
+
)
|
|
1071
|
+
assert spec.container is not None
|
|
1072
|
+
assert spec.container.environment is not None
|
|
1073
|
+
env = {entry.name: entry.value for entry in spec.container.environment}
|
|
1074
|
+
assert env["HOSTNAME"] == "0.0.0.0"
|
|
1075
|
+
assert env["PORT"] == "3000"
|
|
986
1076
|
|
|
987
1077
|
|
|
988
1078
|
def test_init_rejects_react_backend_agent(tmp_path) -> None:
|