meshagent-cli 0.41.0__tar.gz → 0.41.1__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.0 → meshagent_cli-0.41.1}/PKG-INFO +16 -16
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/create.py +14 -5
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/create_test.py +36 -5
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/image.py +23 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/image_test.py +57 -5
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/subscriptions.py +26 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/create.py +14 -3
- meshagent_cli-0.41.1/meshagent/cli/version.py +1 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent_cli.egg-info/PKG-INFO +16 -16
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent_cli.egg-info/requires.txt +15 -15
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/pyproject.toml +15 -15
- meshagent_cli-0.41.0/meshagent/cli/version.py +0 -1
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/LICENSE +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/README.md +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/__init__.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/agent.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/agent_cli_options_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/agent_package_cli.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/agent_package_cli_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/agents.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/agents_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/api_keys.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/api_keys_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/ask.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/ask_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/async_typer.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/async_typer_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/auth.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/auth_async.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/auth_async_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/auth_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/call.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/chatbot.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/cli.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/cli_mcp.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/cli_secrets.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/cli_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/common_options.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/config.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/config_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/containers.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/containers_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/create_project_templates/__init__.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/dataset.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/dataset_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/developer.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/developer_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/doctor.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/doctor_templates/__init__.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/doctor_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/feeds.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/helper.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/helper_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/helpers.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/host.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/launch.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/launch_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/llm.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/llm_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/local_settings.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/local_settings_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/mailbot.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/mailbot_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/mailboxes.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/meeting_transcriber.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/memory.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/memory_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/meshagent_images.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/meshagent_images_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/messaging.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/multi.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/oauth2.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/oauth2_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/oci_archive.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/oci_archive_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/participant_token.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/port.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/port_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/preamble_rules.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/preamble_rules_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/process.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/process_live_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/process_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/projects.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/projects_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/queue.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/queue_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/registry.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/registry_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/room.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/room_connect.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/room_connect_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/room_services.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/rooms.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/rooms_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/root_commands.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/root_commands_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/routes.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/scheduled_tasks.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/scheduled_tasks_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/services.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/services_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/sessions.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/sessions_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/storage.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/storage_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/sync.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/sync_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/task_runner.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/task_runner_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tool_call_summary.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tool_call_summary_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tool_integrations.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tool_integrations_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/__init__.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/auth_switch.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/auth_switch_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/deploy_room.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/project_activate.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/project_activate_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/setup.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/setup_splash_frames.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/tui/setup_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/voicebot.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/webhook.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/webserver.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/webserver_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/worker.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/worker_test.py +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent_cli.egg-info/SOURCES.txt +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent_cli.egg-info/dependency_links.txt +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent_cli.egg-info/entry_points.txt +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent_cli.egg-info/top_level.txt +0 -0
- {meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.41.
|
|
3
|
+
Version: 0.41.1
|
|
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.41.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.41.1
|
|
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.41.
|
|
34
|
-
Requires-Dist: meshagent-api[all]==0.41.
|
|
35
|
-
Requires-Dist: meshagent-commoncrawl==0.41.
|
|
36
|
-
Requires-Dist: meshagent-scrapy==0.41.
|
|
37
|
-
Requires-Dist: meshagent-computers==0.41.
|
|
38
|
-
Requires-Dist: meshagent-openai==0.41.
|
|
39
|
-
Requires-Dist: meshagent-anthropic==0.41.
|
|
40
|
-
Requires-Dist: meshagent-otel==0.41.
|
|
41
|
-
Requires-Dist: meshagent-mcp==0.41.
|
|
42
|
-
Requires-Dist: meshagent-tools==0.41.
|
|
33
|
+
Requires-Dist: meshagent-agents[all]==0.41.1; extra == "all"
|
|
34
|
+
Requires-Dist: meshagent-api[all]==0.41.1; extra == "all"
|
|
35
|
+
Requires-Dist: meshagent-commoncrawl==0.41.1; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-scrapy==0.41.1; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-computers==0.41.1; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-openai==0.41.1; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-anthropic==0.41.1; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-otel==0.41.1; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-mcp==0.41.1; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-tools==0.41.1; 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.41.
|
|
47
|
-
Requires-Dist: meshagent-api==0.41.
|
|
48
|
-
Requires-Dist: meshagent-mcp==0.41.
|
|
49
|
-
Requires-Dist: meshagent-tools==0.41.
|
|
46
|
+
Requires-Dist: meshagent-agents[all]==0.41.1; extra == "mcp-service"
|
|
47
|
+
Requires-Dist: meshagent-api==0.41.1; extra == "mcp-service"
|
|
48
|
+
Requires-Dist: meshagent-mcp==0.41.1; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-tools==0.41.1; extra == "mcp-service"
|
|
50
50
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
51
51
|
Dynamic: license-file
|
|
52
52
|
|
|
@@ -4,6 +4,7 @@ import asyncio
|
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from importlib import resources
|
|
6
6
|
from pathlib import Path
|
|
7
|
+
import shlex
|
|
7
8
|
import sys
|
|
8
9
|
from typing import Literal, Mapping, Sequence
|
|
9
10
|
|
|
@@ -689,10 +690,10 @@ def _run_create_tui(
|
|
|
689
690
|
return result.selected_language_id, result.selected_focus_id
|
|
690
691
|
|
|
691
692
|
|
|
692
|
-
def _run_existing_project_tui() -> ExistingProjectSelection | None:
|
|
693
|
+
def _run_existing_project_tui(*, root: Path) -> ExistingProjectSelection | None:
|
|
693
694
|
from meshagent.cli.tui.create import run_existing_project_create_tui
|
|
694
695
|
|
|
695
|
-
result = asyncio.run(run_existing_project_create_tui())
|
|
696
|
+
result = asyncio.run(run_existing_project_create_tui(root=root))
|
|
696
697
|
if result.status != "completed" or result.action is None:
|
|
697
698
|
return None
|
|
698
699
|
return ExistingProjectSelection(
|
|
@@ -736,13 +737,19 @@ def _write_template(root: Path, template: CreateTemplate) -> None:
|
|
|
736
737
|
_write_file(root / name, template_name)
|
|
737
738
|
|
|
738
739
|
|
|
739
|
-
def _print_created_report(
|
|
740
|
+
def _print_created_report(
|
|
741
|
+
*,
|
|
742
|
+
template: CreateTemplate,
|
|
743
|
+
enter_project_root: Path | None = None,
|
|
744
|
+
) -> None:
|
|
740
745
|
click.echo("")
|
|
741
746
|
click.echo(f"Created a minimal deployable {template.label} project:")
|
|
742
747
|
for name in template.files:
|
|
743
748
|
click.echo(f" {name}")
|
|
744
749
|
click.echo("")
|
|
745
750
|
click.echo("Next steps:")
|
|
751
|
+
if enter_project_root is not None:
|
|
752
|
+
click.echo(f" cd {shlex.quote(str(enter_project_root))}")
|
|
746
753
|
for step in template.next_steps:
|
|
747
754
|
click.echo(f" {step}")
|
|
748
755
|
|
|
@@ -796,6 +803,7 @@ def create_command(
|
|
|
796
803
|
|
|
797
804
|
click.echo("meshagent create")
|
|
798
805
|
click.echo(f"Project: {root}")
|
|
806
|
+
enter_project_root: Path | None = None
|
|
799
807
|
|
|
800
808
|
is_interactive_stdio = _stdio_is_interactive()
|
|
801
809
|
if interactive is True and not is_interactive_stdio:
|
|
@@ -806,7 +814,7 @@ def create_command(
|
|
|
806
814
|
|
|
807
815
|
if _has_existing_project_content(root):
|
|
808
816
|
if interactive is not False and is_interactive_stdio:
|
|
809
|
-
existing_project_selection = _run_existing_project_tui()
|
|
817
|
+
existing_project_selection = _run_existing_project_tui(root=root)
|
|
810
818
|
if existing_project_selection is None:
|
|
811
819
|
click.echo("Create canceled.")
|
|
812
820
|
return
|
|
@@ -820,6 +828,7 @@ def create_command(
|
|
|
820
828
|
existing_project_selection.subfolder_name,
|
|
821
829
|
)
|
|
822
830
|
root.mkdir(parents=True, exist_ok=False)
|
|
831
|
+
enter_project_root = root
|
|
823
832
|
click.echo(f"New project: {root}")
|
|
824
833
|
else:
|
|
825
834
|
click.echo("")
|
|
@@ -851,4 +860,4 @@ def create_command(
|
|
|
851
860
|
|
|
852
861
|
template = _resolve_template(language_id, focus_id)
|
|
853
862
|
_write_template(root, template)
|
|
854
|
-
_print_created_report(template=template)
|
|
863
|
+
_print_created_report(template=template, enter_project_root=enter_project_root)
|
|
@@ -641,6 +641,7 @@ def test_init_creates_typescript_chatbot_ui_non_interactively(tmp_path) -> None:
|
|
|
641
641
|
assert (tmp_path / "tsconfig.json").is_file()
|
|
642
642
|
assert (tmp_path / "next.config.ts").is_file()
|
|
643
643
|
assert (tmp_path / "next-env.d.ts").is_file()
|
|
644
|
+
assert not (tmp_path / "server.ts").exists()
|
|
644
645
|
assert (tmp_path / "app" / "layout.tsx").is_file()
|
|
645
646
|
assert (tmp_path / "app" / "page.tsx").is_file()
|
|
646
647
|
assert (tmp_path / "app" / "globals.css").is_file()
|
|
@@ -653,8 +654,12 @@ def test_init_creates_typescript_chatbot_ui_non_interactively(tmp_path) -> None:
|
|
|
653
654
|
assert '"name": "meshagent-create-typescript-chatbot-ui"' in package_json
|
|
654
655
|
assert '"@msgpack/msgpack"' in package_json
|
|
655
656
|
assert '"next"' in package_json
|
|
657
|
+
assert '"next": "^16.2.6"' in package_json
|
|
658
|
+
assert '"@vercel/ncc"' not in package_json
|
|
659
|
+
assert '"build": "next build"' in package_json
|
|
660
|
+
assert '"start": "node .next/standalone/server.js"' in package_json
|
|
656
661
|
assert (
|
|
657
|
-
'"deploy": "meshagent deploy . --tag meshagent-create-typescript-chatbot-ui:dev --
|
|
662
|
+
'"deploy": "meshagent deploy . --tag meshagent-create-typescript-chatbot-ui:dev --private --validation-mode=cookie --extra-port=3001:/messages --liveness /health --wait"'
|
|
658
663
|
in package_json
|
|
659
664
|
)
|
|
660
665
|
assert 'from "@msgpack/msgpack"' in page_tsx
|
|
@@ -664,6 +669,11 @@ def test_init_creates_typescript_chatbot_ui_non_interactively(tmp_path) -> None:
|
|
|
664
669
|
assert "meshagent.agent.turn.ended" in page_tsx
|
|
665
670
|
assert "/messages" in page_tsx
|
|
666
671
|
assert "disabled={!canSend}" in page_tsx
|
|
672
|
+
assert "FROM scratch" in dockerfile
|
|
673
|
+
assert "LABEL meshagent.runtime=node" in dockerfile
|
|
674
|
+
assert "COPY --from=build /app/.next/standalone /app" in dockerfile
|
|
675
|
+
assert "COPY --from=build /app/.next/static /app/.next/static" in dockerfile
|
|
676
|
+
assert 'CMD ["server.js"]' in dockerfile
|
|
667
677
|
assert "ENV HOSTNAME=0.0.0.0" in dockerfile
|
|
668
678
|
assert "EXPOSE 3000" in dockerfile
|
|
669
679
|
|
|
@@ -1028,7 +1038,9 @@ def test_create_existing_project_tui_cancel_uses_create_wording(
|
|
|
1028
1038
|
) -> None:
|
|
1029
1039
|
(tmp_path / "server.py").write_text("print('already here')\n", encoding="utf-8")
|
|
1030
1040
|
monkeypatch.setattr(create_module, "_stdio_is_interactive", lambda: True)
|
|
1031
|
-
monkeypatch.setattr(
|
|
1041
|
+
monkeypatch.setattr(
|
|
1042
|
+
create_module, "_run_existing_project_tui", lambda *, root: None
|
|
1043
|
+
)
|
|
1032
1044
|
|
|
1033
1045
|
result = CliRunner().invoke(create_command, [str(tmp_path)])
|
|
1034
1046
|
|
|
@@ -1253,6 +1265,24 @@ def test_init_tui_existing_project_subfolder_prompt_rejects_paths(
|
|
|
1253
1265
|
assert app.result.status == "canceled"
|
|
1254
1266
|
|
|
1255
1267
|
|
|
1268
|
+
def test_init_tui_existing_project_subfolder_prompt_rejects_used_folder(
|
|
1269
|
+
tmp_path,
|
|
1270
|
+
monkeypatch,
|
|
1271
|
+
) -> None:
|
|
1272
|
+
from meshagent.cli.tui.create import CreateExistingProjectApp
|
|
1273
|
+
|
|
1274
|
+
(tmp_path / "hello-agent").mkdir()
|
|
1275
|
+
app = CreateExistingProjectApp(root=tmp_path)
|
|
1276
|
+
errors: list[str] = []
|
|
1277
|
+
monkeypatch.setattr(app, "_set_error_text", errors.append)
|
|
1278
|
+
|
|
1279
|
+
submitted = app._submit_subfolder_name("hello-agent")
|
|
1280
|
+
|
|
1281
|
+
assert submitted is False
|
|
1282
|
+
assert errors == ["Folder is already in use. Enter an empty folder name."]
|
|
1283
|
+
assert app.result.status == "canceled"
|
|
1284
|
+
|
|
1285
|
+
|
|
1256
1286
|
def test_init_existing_code_interactive_can_run_doctor_here(
|
|
1257
1287
|
tmp_path,
|
|
1258
1288
|
monkeypatch,
|
|
@@ -1264,7 +1294,7 @@ def test_init_existing_code_interactive_can_run_doctor_here(
|
|
|
1264
1294
|
monkeypatch.setattr(
|
|
1265
1295
|
create_module,
|
|
1266
1296
|
"_run_existing_project_tui",
|
|
1267
|
-
lambda: create_module.ExistingProjectSelection(action="run-doctor"),
|
|
1297
|
+
lambda *, root: create_module.ExistingProjectSelection(action="run-doctor"),
|
|
1268
1298
|
)
|
|
1269
1299
|
monkeypatch.setattr(create_module, "_run_doctor", doctor_paths.append)
|
|
1270
1300
|
monkeypatch.setattr(
|
|
@@ -1292,7 +1322,7 @@ def test_init_existing_code_interactive_creates_project_in_subfolder(
|
|
|
1292
1322
|
monkeypatch.setattr(
|
|
1293
1323
|
create_module,
|
|
1294
1324
|
"_run_existing_project_tui",
|
|
1295
|
-
lambda: create_module.ExistingProjectSelection(
|
|
1325
|
+
lambda *, root: create_module.ExistingProjectSelection(
|
|
1296
1326
|
action="create-subfolder",
|
|
1297
1327
|
subfolder_name="hello-agent",
|
|
1298
1328
|
),
|
|
@@ -1308,6 +1338,7 @@ def test_init_existing_code_interactive_creates_project_in_subfolder(
|
|
|
1308
1338
|
|
|
1309
1339
|
assert result.exit_code == 0
|
|
1310
1340
|
assert f"New project: {project_root.resolve()}" in result.output
|
|
1341
|
+
assert f" cd {project_root.resolve()}" in result.output
|
|
1311
1342
|
assert (project_root / "package.json").is_file()
|
|
1312
1343
|
assert (project_root / "src" / "server.ts").is_file()
|
|
1313
1344
|
assert (project_root / "Dockerfile").is_file()
|
|
@@ -1328,7 +1359,7 @@ def test_init_existing_code_interactive_rejects_existing_subfolder(
|
|
|
1328
1359
|
monkeypatch.setattr(
|
|
1329
1360
|
create_module,
|
|
1330
1361
|
"_run_existing_project_tui",
|
|
1331
|
-
lambda: create_module.ExistingProjectSelection(
|
|
1362
|
+
lambda *, root: create_module.ExistingProjectSelection(
|
|
1332
1363
|
action="create-subfolder",
|
|
1333
1364
|
subfolder_name="hello-agent",
|
|
1334
1365
|
),
|
|
@@ -51,6 +51,7 @@ from meshagent.api.client import (
|
|
|
51
51
|
Route,
|
|
52
52
|
Room,
|
|
53
53
|
)
|
|
54
|
+
from meshagent.api.error_codes import ErrorCode
|
|
54
55
|
from meshagent.api.image_runtime import (
|
|
55
56
|
IMAGE_RUNTIME_BASES,
|
|
56
57
|
IMAGE_RUNTIME_LABEL,
|
|
@@ -62,6 +63,7 @@ from meshagent.api.registry_auth import DEFAULT_REGISTRY_HOST, DEFAULT_REGISTRY_
|
|
|
62
63
|
from meshagent.api.room_server_client import (
|
|
63
64
|
DockerSecret,
|
|
64
65
|
LogStream,
|
|
66
|
+
RoomException,
|
|
65
67
|
ServiceRuntimeState,
|
|
66
68
|
)
|
|
67
69
|
from meshagent.api.room_ports import RESERVED_ROOM_SERVICE_PORTS
|
|
@@ -1336,6 +1338,10 @@ def _resolve_runtime_container_override(
|
|
|
1336
1338
|
subpath=IMAGE_RUNTIME_MOUNT_SUBPATH,
|
|
1337
1339
|
read_only=True,
|
|
1338
1340
|
),
|
|
1341
|
+
default_environment=tuple(
|
|
1342
|
+
EnvironmentVariable(name=name, value=value)
|
|
1343
|
+
for name, value in dockerfile_metadata.environment
|
|
1344
|
+
),
|
|
1339
1345
|
)
|
|
1340
1346
|
|
|
1341
1347
|
|
|
@@ -2148,6 +2154,19 @@ def _build_deploy_service_spec(
|
|
|
2148
2154
|
return _ServiceDeployPlan(spec=spec, service_id_annotation=service_name)
|
|
2149
2155
|
|
|
2150
2156
|
|
|
2157
|
+
async def _delete_built_image_from_room_cache(
|
|
2158
|
+
*,
|
|
2159
|
+
client: RoomClient,
|
|
2160
|
+
parsed_tag: _ParsedImageTag,
|
|
2161
|
+
) -> None:
|
|
2162
|
+
try:
|
|
2163
|
+
await client.containers.delete_image(image=parsed_tag.value)
|
|
2164
|
+
except RoomException as exc:
|
|
2165
|
+
if exc.code in {ErrorCode.NOT_FOUND, ErrorCode.CONTAINER_NOT_FOUND}:
|
|
2166
|
+
return
|
|
2167
|
+
raise
|
|
2168
|
+
|
|
2169
|
+
|
|
2151
2170
|
def _update_request_validation_annotations(
|
|
2152
2171
|
*,
|
|
2153
2172
|
annotations: dict[str, str],
|
|
@@ -3451,6 +3470,10 @@ async def deploy_image(
|
|
|
3451
3470
|
cred=cred,
|
|
3452
3471
|
add_latest_tag=latest,
|
|
3453
3472
|
)
|
|
3473
|
+
await _delete_built_image_from_room_cache(
|
|
3474
|
+
client=client,
|
|
3475
|
+
parsed_tag=parsed_tag,
|
|
3476
|
+
)
|
|
3454
3477
|
deploy_result = await _apply_deploy_plan(
|
|
3455
3478
|
account_client=account_client,
|
|
3456
3479
|
client=client,
|
|
@@ -26,9 +26,10 @@ from meshagent.api.image_runtime import (
|
|
|
26
26
|
IMAGE_RUNTIME_MOUNT_PATH,
|
|
27
27
|
IMAGE_RUNTIME_MOUNT_SUBPATH,
|
|
28
28
|
)
|
|
29
|
+
from meshagent.api.error_codes import ErrorCode
|
|
29
30
|
from meshagent.api.room_ports import ROOM_INTERNAL_API_PORT
|
|
30
31
|
from meshagent.cli import async_typer, cli, image
|
|
31
|
-
from meshagent.api.room_server_client import ServiceRuntimeState
|
|
32
|
+
from meshagent.api.room_server_client import RoomException, ServiceRuntimeState
|
|
32
33
|
from meshagent.api.specs.service import (
|
|
33
34
|
ContainerMountSpec,
|
|
34
35
|
ContainerSpec,
|
|
@@ -2662,6 +2663,25 @@ async def test_deploy_image_env_secret_requires_matching_token_identity(
|
|
|
2662
2663
|
assert captured["account_client_closed"] is True
|
|
2663
2664
|
|
|
2664
2665
|
|
|
2666
|
+
@pytest.mark.asyncio
|
|
2667
|
+
async def test_delete_built_image_from_room_cache_ignores_missing_image() -> None:
|
|
2668
|
+
captured: dict[str, object] = {}
|
|
2669
|
+
|
|
2670
|
+
class _FakeContainers:
|
|
2671
|
+
async def delete_image(self, *, image: str) -> None:
|
|
2672
|
+
captured["deleted_image"] = image
|
|
2673
|
+
raise RoomException("image not found", code=ErrorCode.NOT_FOUND)
|
|
2674
|
+
|
|
2675
|
+
client = SimpleNamespace(containers=_FakeContainers())
|
|
2676
|
+
|
|
2677
|
+
await image._delete_built_image_from_room_cache(
|
|
2678
|
+
client=client,
|
|
2679
|
+
parsed_tag=image._parse_build_tag("registry.meshagent.com/repo/web:1"),
|
|
2680
|
+
)
|
|
2681
|
+
|
|
2682
|
+
assert captured["deleted_image"] == "registry.meshagent.com/repo/web:1"
|
|
2683
|
+
|
|
2684
|
+
|
|
2665
2685
|
@pytest.mark.asyncio
|
|
2666
2686
|
async def test_deploy_image_pack_builds_before_deploying(
|
|
2667
2687
|
monkeypatch: pytest.MonkeyPatch,
|
|
@@ -2692,6 +2712,13 @@ async def test_deploy_image_pack_builds_before_deploying(
|
|
|
2692
2712
|
return DeployDomainPromptResult(status="skipped")
|
|
2693
2713
|
|
|
2694
2714
|
class _FakeRoomClient:
|
|
2715
|
+
def __init__(self) -> None:
|
|
2716
|
+
self.containers = SimpleNamespace(delete_image=self._delete_image)
|
|
2717
|
+
|
|
2718
|
+
async def _delete_image(self, *, image: str) -> None:
|
|
2719
|
+
captured["events"].append("delete")
|
|
2720
|
+
captured["deleted_image"] = image
|
|
2721
|
+
|
|
2695
2722
|
async def __aexit__(self, exc_type, exc, tb) -> None:
|
|
2696
2723
|
del exc_type, exc, tb
|
|
2697
2724
|
captured["room_client_closed"] = True
|
|
@@ -2770,7 +2797,8 @@ async def test_deploy_image_pack_builds_before_deploying(
|
|
|
2770
2797
|
"service_name": "repo-web",
|
|
2771
2798
|
"port": "8080",
|
|
2772
2799
|
}
|
|
2773
|
-
assert captured["
|
|
2800
|
+
assert captured["deleted_image"] == "registry.meshagent.com/repo/web:1"
|
|
2801
|
+
assert captured["events"] == ["domain_tui", "build", "delete", "create"]
|
|
2774
2802
|
created_service = captured["created_service"]
|
|
2775
2803
|
assert isinstance(created_service, tuple)
|
|
2776
2804
|
service_spec = created_service[2]
|
|
@@ -2977,6 +3005,13 @@ async def test_deploy_image_pack_allows_matching_volume_mount(
|
|
|
2977
3005
|
captured["events"].append("build")
|
|
2978
3006
|
|
|
2979
3007
|
class _FakeRoomClient:
|
|
3008
|
+
def __init__(self) -> None:
|
|
3009
|
+
self.containers = SimpleNamespace(delete_image=self._delete_image)
|
|
3010
|
+
|
|
3011
|
+
async def _delete_image(self, *, image: str) -> None:
|
|
3012
|
+
captured["events"].append("delete")
|
|
3013
|
+
captured["deleted_image"] = image
|
|
3014
|
+
|
|
2980
3015
|
async def __aexit__(self, exc_type, exc, tb) -> None:
|
|
2981
3016
|
del exc_type, exc, tb
|
|
2982
3017
|
captured["room_client_closed"] = True
|
|
@@ -3034,7 +3069,8 @@ async def test_deploy_image_pack_allows_matching_volume_mount(
|
|
|
3034
3069
|
assert service_spec.container.storage is not None
|
|
3035
3070
|
assert service_spec.container.storage.empty_dirs is not None
|
|
3036
3071
|
assert service_spec.container.storage.empty_dirs[0].path == "/data"
|
|
3037
|
-
assert captured["
|
|
3072
|
+
assert captured["deleted_image"] == "registry.meshagent.com/repo/web:1"
|
|
3073
|
+
assert captured["events"] == ["build", "delete", "create"]
|
|
3038
3074
|
assert captured["room_client_closed"] is True
|
|
3039
3075
|
assert captured["account_client_closed"] is True
|
|
3040
3076
|
|
|
@@ -3065,6 +3101,13 @@ CMD ["/app/dist/index.js"]
|
|
|
3065
3101
|
captured["events"].append("build")
|
|
3066
3102
|
|
|
3067
3103
|
class _FakeRoomClient:
|
|
3104
|
+
def __init__(self) -> None:
|
|
3105
|
+
self.containers = SimpleNamespace(delete_image=self._delete_image)
|
|
3106
|
+
|
|
3107
|
+
async def _delete_image(self, *, image: str) -> None:
|
|
3108
|
+
captured["events"].append("delete")
|
|
3109
|
+
captured["deleted_image"] = image
|
|
3110
|
+
|
|
3068
3111
|
async def __aexit__(self, exc_type, exc, tb) -> None:
|
|
3069
3112
|
del exc_type, exc, tb
|
|
3070
3113
|
captured["room_client_closed"] = True
|
|
@@ -3135,10 +3178,14 @@ CMD ["/app/dist/index.js"]
|
|
|
3135
3178
|
read_only=True,
|
|
3136
3179
|
)
|
|
3137
3180
|
]
|
|
3138
|
-
assert service_spec.container.environment
|
|
3181
|
+
assert service_spec.container.environment == [
|
|
3182
|
+
EnvironmentVariable(name="NODE_ENV", value="production"),
|
|
3183
|
+
EnvironmentVariable(name="PORT", value="8111"),
|
|
3184
|
+
]
|
|
3139
3185
|
assert service_spec.ports is not None
|
|
3140
3186
|
assert service_spec.ports[0].num == 8111
|
|
3141
|
-
assert captured["
|
|
3187
|
+
assert captured["deleted_image"] == "registry.meshagent.com/repo/web:1"
|
|
3188
|
+
assert captured["events"] == ["build", "delete", "create"]
|
|
3142
3189
|
assert captured["room_client_closed"] is True
|
|
3143
3190
|
assert captured["account_client_closed"] is True
|
|
3144
3191
|
|
|
@@ -3162,10 +3209,14 @@ async def test_deploy_image_pack_domain_uses_inferred_exposed_port(
|
|
|
3162
3209
|
class _FakeRoomClient:
|
|
3163
3210
|
def __init__(self) -> None:
|
|
3164
3211
|
self.services = SimpleNamespace(restart=self._restart)
|
|
3212
|
+
self.containers = SimpleNamespace(delete_image=self._delete_image)
|
|
3165
3213
|
|
|
3166
3214
|
async def _restart(self, *, service_id: str) -> None:
|
|
3167
3215
|
captured["restarted_service_id"] = service_id
|
|
3168
3216
|
|
|
3217
|
+
async def _delete_image(self, *, image: str) -> None:
|
|
3218
|
+
captured["deleted_image"] = image
|
|
3219
|
+
|
|
3169
3220
|
async def __aexit__(self, exc_type, exc, tb) -> None:
|
|
3170
3221
|
del exc_type, exc, tb
|
|
3171
3222
|
captured["room_client_closed"] = True
|
|
@@ -3238,6 +3289,7 @@ async def test_deploy_image_pack_domain_uses_inferred_exposed_port(
|
|
|
3238
3289
|
assert service_spec.ports[0].public is None
|
|
3239
3290
|
assert service_spec.ports[0].liveness == "/"
|
|
3240
3291
|
assert service_spec.metadata.annotations is not None
|
|
3292
|
+
assert captured["deleted_image"] == "registry.meshagent.com/repo/web:1"
|
|
3241
3293
|
assert (
|
|
3242
3294
|
service_spec.metadata.annotations[image.ANNOTATION_REQUEST_VALIDATION_METHOD]
|
|
3243
3295
|
== "cookie"
|
|
@@ -39,6 +39,7 @@ def _subscription_row(subscription: Any) -> dict[str, str]:
|
|
|
39
39
|
"id": subscription.id,
|
|
40
40
|
"room": subscription.room,
|
|
41
41
|
"path": subscription.path,
|
|
42
|
+
"filename_datetime_format": subscription.filename_datetime_format or "",
|
|
42
43
|
}
|
|
43
44
|
|
|
44
45
|
|
|
@@ -49,6 +50,16 @@ async def subscription_create(
|
|
|
49
50
|
feed_id: Annotated[str, typer.Option("--feed-id", help="Feed id")],
|
|
50
51
|
room: Annotated[str, typer.Option("--room", help="Room name")],
|
|
51
52
|
path: Annotated[str, typer.Option("--path", help="Storage path prefix")],
|
|
53
|
+
filename_datetime_format: Annotated[
|
|
54
|
+
Optional[str],
|
|
55
|
+
typer.Option(
|
|
56
|
+
"--filename-datetime-format",
|
|
57
|
+
help=(
|
|
58
|
+
"GCP Cloud Storage filename datetime format. "
|
|
59
|
+
"Use slashes to bucket files, for example YYYY/MM/DD/hh_mm_ssZ."
|
|
60
|
+
),
|
|
61
|
+
),
|
|
62
|
+
] = None,
|
|
52
63
|
annotations: Annotated[
|
|
53
64
|
Optional[str],
|
|
54
65
|
typer.Option(
|
|
@@ -65,6 +76,7 @@ async def subscription_create(
|
|
|
65
76
|
feed_id=feed_id,
|
|
66
77
|
room=resolve_room(room),
|
|
67
78
|
path=path,
|
|
79
|
+
filename_datetime_format=filename_datetime_format,
|
|
68
80
|
annotations=_parse_annotations(annotations) or {},
|
|
69
81
|
)
|
|
70
82
|
print(subscription.model_dump(mode="json"))
|
|
@@ -78,6 +90,16 @@ async def subscription_update(
|
|
|
78
90
|
project_id: ProjectIdOption,
|
|
79
91
|
feed_id: Annotated[str, typer.Option("--feed-id", help="Feed id")],
|
|
80
92
|
subscription_id: Annotated[str, typer.Argument(help="Subscription id to update")],
|
|
93
|
+
filename_datetime_format: Annotated[
|
|
94
|
+
Optional[str],
|
|
95
|
+
typer.Option(
|
|
96
|
+
"--filename-datetime-format",
|
|
97
|
+
help=(
|
|
98
|
+
"GCP Cloud Storage filename datetime format. "
|
|
99
|
+
"Pass an empty string to restore the default."
|
|
100
|
+
),
|
|
101
|
+
),
|
|
102
|
+
] = None,
|
|
81
103
|
annotations: Annotated[
|
|
82
104
|
Optional[str],
|
|
83
105
|
typer.Option(
|
|
@@ -98,6 +120,9 @@ async def subscription_update(
|
|
|
98
120
|
project_id=project_id,
|
|
99
121
|
feed_id=feed_id,
|
|
100
122
|
subscription_id=subscription_id,
|
|
123
|
+
filename_datetime_format=filename_datetime_format
|
|
124
|
+
if filename_datetime_format is not None
|
|
125
|
+
else existing.filename_datetime_format,
|
|
101
126
|
annotations=_parse_annotations(annotations)
|
|
102
127
|
if annotations is not None
|
|
103
128
|
else existing.annotations,
|
|
@@ -168,6 +193,7 @@ async def subscription_list(
|
|
|
168
193
|
"id",
|
|
169
194
|
"room",
|
|
170
195
|
"path",
|
|
196
|
+
"filename_datetime_format",
|
|
171
197
|
)
|
|
172
198
|
finally:
|
|
173
199
|
await client.close()
|
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
6
|
from dataclasses import dataclass
|
|
7
|
+
from pathlib import Path
|
|
7
8
|
from typing import Literal, Sequence
|
|
8
9
|
|
|
9
10
|
|
|
@@ -160,8 +161,9 @@ class CreateExistingProjectApp(App[None]):
|
|
|
160
161
|
Binding("escape", "cancel_or_back", "Cancel", priority=True),
|
|
161
162
|
]
|
|
162
163
|
|
|
163
|
-
def __init__(self) -> None:
|
|
164
|
+
def __init__(self, *, root: Path | None = None) -> None:
|
|
164
165
|
super().__init__()
|
|
166
|
+
self._root = root
|
|
165
167
|
self._mode: Literal["choice", "folder_name"] = "choice"
|
|
166
168
|
self._title_view: Static | None = None
|
|
167
169
|
self._message_view: Static | None = None
|
|
@@ -330,6 +332,12 @@ class CreateExistingProjectApp(App[None]):
|
|
|
330
332
|
self._set_error_text(str(error))
|
|
331
333
|
return False
|
|
332
334
|
|
|
335
|
+
if self._root is not None and (self._root / resolved_subfolder_name).exists():
|
|
336
|
+
self._set_error_text(
|
|
337
|
+
"Folder is already in use. Enter an empty folder name."
|
|
338
|
+
)
|
|
339
|
+
return False
|
|
340
|
+
|
|
333
341
|
self.result = CreateExistingProjectResult(
|
|
334
342
|
status="completed",
|
|
335
343
|
action=EXISTING_ACTION_SUBFOLDER,
|
|
@@ -573,8 +581,11 @@ async def run_create_wizard_tui(
|
|
|
573
581
|
return app.result
|
|
574
582
|
|
|
575
583
|
|
|
576
|
-
async def run_existing_project_create_tui(
|
|
577
|
-
|
|
584
|
+
async def run_existing_project_create_tui(
|
|
585
|
+
*,
|
|
586
|
+
root: Path | None = None,
|
|
587
|
+
) -> CreateExistingProjectResult:
|
|
588
|
+
app = CreateExistingProjectApp(root=root)
|
|
578
589
|
|
|
579
590
|
try:
|
|
580
591
|
await _run_app(app)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.41.1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.41.
|
|
3
|
+
Version: 0.41.1
|
|
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.41.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.41.1
|
|
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.41.
|
|
34
|
-
Requires-Dist: meshagent-api[all]==0.41.
|
|
35
|
-
Requires-Dist: meshagent-commoncrawl==0.41.
|
|
36
|
-
Requires-Dist: meshagent-scrapy==0.41.
|
|
37
|
-
Requires-Dist: meshagent-computers==0.41.
|
|
38
|
-
Requires-Dist: meshagent-openai==0.41.
|
|
39
|
-
Requires-Dist: meshagent-anthropic==0.41.
|
|
40
|
-
Requires-Dist: meshagent-otel==0.41.
|
|
41
|
-
Requires-Dist: meshagent-mcp==0.41.
|
|
42
|
-
Requires-Dist: meshagent-tools==0.41.
|
|
33
|
+
Requires-Dist: meshagent-agents[all]==0.41.1; extra == "all"
|
|
34
|
+
Requires-Dist: meshagent-api[all]==0.41.1; extra == "all"
|
|
35
|
+
Requires-Dist: meshagent-commoncrawl==0.41.1; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-scrapy==0.41.1; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-computers==0.41.1; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-openai==0.41.1; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-anthropic==0.41.1; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-otel==0.41.1; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-mcp==0.41.1; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-tools==0.41.1; 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.41.
|
|
47
|
-
Requires-Dist: meshagent-api==0.41.
|
|
48
|
-
Requires-Dist: meshagent-mcp==0.41.
|
|
49
|
-
Requires-Dist: meshagent-tools==0.41.
|
|
46
|
+
Requires-Dist: meshagent-agents[all]==0.41.1; extra == "mcp-service"
|
|
47
|
+
Requires-Dist: meshagent-api==0.41.1; extra == "mcp-service"
|
|
48
|
+
Requires-Dist: meshagent-mcp==0.41.1; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-tools==0.41.1; extra == "mcp-service"
|
|
50
50
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
51
51
|
Dynamic: license-file
|
|
52
52
|
|
|
@@ -11,7 +11,7 @@ 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.41.
|
|
14
|
+
meshagent-llm-proxy==0.41.1
|
|
15
15
|
rich~=14.3.0
|
|
16
16
|
sounddevice~=0.5
|
|
17
17
|
textual<9.0,>=8.2.3
|
|
@@ -20,22 +20,22 @@ ascii-magic~=2.3
|
|
|
20
20
|
pillow~=11.3.0
|
|
21
21
|
|
|
22
22
|
[all]
|
|
23
|
-
meshagent-agents[all]==0.41.
|
|
24
|
-
meshagent-api[all]==0.41.
|
|
25
|
-
meshagent-commoncrawl==0.41.
|
|
26
|
-
meshagent-scrapy==0.41.
|
|
27
|
-
meshagent-computers==0.41.
|
|
28
|
-
meshagent-openai==0.41.
|
|
29
|
-
meshagent-anthropic==0.41.
|
|
30
|
-
meshagent-otel==0.41.
|
|
31
|
-
meshagent-mcp==0.41.
|
|
32
|
-
meshagent-tools==0.41.
|
|
23
|
+
meshagent-agents[all]==0.41.1
|
|
24
|
+
meshagent-api[all]==0.41.1
|
|
25
|
+
meshagent-commoncrawl==0.41.1
|
|
26
|
+
meshagent-scrapy==0.41.1
|
|
27
|
+
meshagent-computers==0.41.1
|
|
28
|
+
meshagent-openai==0.41.1
|
|
29
|
+
meshagent-anthropic==0.41.1
|
|
30
|
+
meshagent-otel==0.41.1
|
|
31
|
+
meshagent-mcp==0.41.1
|
|
32
|
+
meshagent-tools==0.41.1
|
|
33
33
|
supabase-auth~=2.28.0
|
|
34
34
|
prompt-toolkit~=3.0.52
|
|
35
35
|
|
|
36
36
|
[mcp-service]
|
|
37
|
-
meshagent-agents[all]==0.41.
|
|
38
|
-
meshagent-api==0.41.
|
|
39
|
-
meshagent-mcp==0.41.
|
|
40
|
-
meshagent-tools==0.41.
|
|
37
|
+
meshagent-agents[all]==0.41.1
|
|
38
|
+
meshagent-api==0.41.1
|
|
39
|
+
meshagent-mcp==0.41.1
|
|
40
|
+
meshagent-tools==0.41.1
|
|
41
41
|
supabase-auth~=2.28.0
|
|
@@ -22,7 +22,7 @@ dependencies = [
|
|
|
22
22
|
"xlsxwriter~=3.2",
|
|
23
23
|
"pathspec>=1.0.3,<2",
|
|
24
24
|
"zstandard~=0.25.0",
|
|
25
|
-
"meshagent-llm-proxy==0.41.
|
|
25
|
+
"meshagent-llm-proxy==0.41.1",
|
|
26
26
|
"rich~=14.3.0",
|
|
27
27
|
"sounddevice~=0.5",
|
|
28
28
|
"textual>=8.2.3,<9.0",
|
|
@@ -36,25 +36,25 @@ dynamic = ["version", "readme"]
|
|
|
36
36
|
[project.optional-dependencies]
|
|
37
37
|
|
|
38
38
|
all = [
|
|
39
|
-
"meshagent-agents[all]==0.41.
|
|
40
|
-
"meshagent-api[all]==0.41.
|
|
41
|
-
"meshagent-commoncrawl==0.41.
|
|
42
|
-
"meshagent-scrapy==0.41.
|
|
43
|
-
"meshagent-computers==0.41.
|
|
44
|
-
"meshagent-openai==0.41.
|
|
45
|
-
"meshagent-anthropic==0.41.
|
|
46
|
-
"meshagent-otel==0.41.
|
|
47
|
-
"meshagent-mcp==0.41.
|
|
48
|
-
"meshagent-tools==0.41.
|
|
39
|
+
"meshagent-agents[all]==0.41.1",
|
|
40
|
+
"meshagent-api[all]==0.41.1",
|
|
41
|
+
"meshagent-commoncrawl==0.41.1",
|
|
42
|
+
"meshagent-scrapy==0.41.1",
|
|
43
|
+
"meshagent-computers==0.41.1",
|
|
44
|
+
"meshagent-openai==0.41.1",
|
|
45
|
+
"meshagent-anthropic==0.41.1",
|
|
46
|
+
"meshagent-otel==0.41.1",
|
|
47
|
+
"meshagent-mcp==0.41.1",
|
|
48
|
+
"meshagent-tools==0.41.1",
|
|
49
49
|
"supabase-auth~=2.28.0",
|
|
50
50
|
"prompt-toolkit~=3.0.52"
|
|
51
51
|
]
|
|
52
52
|
|
|
53
53
|
mcp-service = [
|
|
54
|
-
"meshagent-agents[all]==0.41.
|
|
55
|
-
"meshagent-api==0.41.
|
|
56
|
-
"meshagent-mcp==0.41.
|
|
57
|
-
"meshagent-tools==0.41.
|
|
54
|
+
"meshagent-agents[all]==0.41.1",
|
|
55
|
+
"meshagent-api==0.41.1",
|
|
56
|
+
"meshagent-mcp==0.41.1",
|
|
57
|
+
"meshagent-tools==0.41.1",
|
|
58
58
|
"supabase-auth~=2.28.0"
|
|
59
59
|
]
|
|
60
60
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.41.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshagent_cli-0.41.0 → meshagent_cli-0.41.1}/meshagent/cli/create_project_templates/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|