meshagent-cli 0.41.5__tar.gz → 0.41.7__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.
Files changed (142) hide show
  1. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/PKG-INFO +16 -16
  2. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/cli.py +6 -0
  3. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/config.py +3 -0
  4. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/config_test.py +24 -0
  5. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/root_commands.py +5 -1
  6. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/root_commands_test.py +46 -0
  7. meshagent_cli-0.41.7/meshagent/cli/version.py +1 -0
  8. meshagent_cli-0.41.7/meshagent/cli/version_check.py +106 -0
  9. meshagent_cli-0.41.7/meshagent/cli/version_check_test.py +58 -0
  10. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent_cli.egg-info/PKG-INFO +16 -16
  11. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent_cli.egg-info/SOURCES.txt +2 -0
  12. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent_cli.egg-info/requires.txt +15 -15
  13. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/pyproject.toml +15 -15
  14. meshagent_cli-0.41.5/meshagent/cli/version.py +0 -1
  15. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/LICENSE +0 -0
  16. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/README.md +0 -0
  17. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/__init__.py +0 -0
  18. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/agent.py +0 -0
  19. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/agent_cli_options_test.py +0 -0
  20. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/agent_package_cli.py +0 -0
  21. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/agent_package_cli_test.py +0 -0
  22. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/agents.py +0 -0
  23. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/agents_test.py +0 -0
  24. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/api_keys.py +0 -0
  25. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/api_keys_test.py +0 -0
  26. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/ask.py +0 -0
  27. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/ask_test.py +0 -0
  28. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/async_typer.py +0 -0
  29. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/async_typer_test.py +0 -0
  30. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/auth.py +0 -0
  31. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/auth_async.py +0 -0
  32. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/auth_async_test.py +0 -0
  33. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/auth_test.py +0 -0
  34. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/call.py +0 -0
  35. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/chatbot.py +0 -0
  36. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/cli_mcp.py +0 -0
  37. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/cli_secrets.py +0 -0
  38. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/cli_test.py +0 -0
  39. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/common_options.py +0 -0
  40. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/containers.py +0 -0
  41. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/containers_test.py +0 -0
  42. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/create.py +0 -0
  43. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/create_project_templates/__init__.py +0 -0
  44. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
  45. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
  46. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
  47. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/create_test.py +0 -0
  48. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/dataset.py +0 -0
  49. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/dataset_test.py +0 -0
  50. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/developer.py +0 -0
  51. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/developer_test.py +0 -0
  52. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/doctor.py +0 -0
  53. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  54. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/doctor_templates/__init__.py +0 -0
  55. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/doctor_test.py +0 -0
  56. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/feeds.py +0 -0
  57. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/helper.py +0 -0
  58. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/helper_test.py +0 -0
  59. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/helpers.py +0 -0
  60. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/host.py +0 -0
  61. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/image.py +0 -0
  62. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/image_test.py +0 -0
  63. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/launch.py +0 -0
  64. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/launch_test.py +0 -0
  65. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/llm.py +0 -0
  66. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/llm_test.py +0 -0
  67. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/local_settings.py +0 -0
  68. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/local_settings_test.py +0 -0
  69. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/mailbot.py +0 -0
  70. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/mailbot_test.py +0 -0
  71. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/mailboxes.py +0 -0
  72. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/meeting_transcriber.py +0 -0
  73. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/memory.py +0 -0
  74. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/memory_test.py +0 -0
  75. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/meshagent_images.py +0 -0
  76. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/meshagent_images_test.py +0 -0
  77. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/messaging.py +0 -0
  78. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/multi.py +0 -0
  79. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/oauth2.py +0 -0
  80. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/oauth2_test.py +0 -0
  81. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/oci_archive.py +0 -0
  82. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/oci_archive_test.py +0 -0
  83. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/participant_token.py +0 -0
  84. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/port.py +0 -0
  85. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/port_test.py +0 -0
  86. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/preamble_rules.py +0 -0
  87. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/preamble_rules_test.py +0 -0
  88. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/process.py +0 -0
  89. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/process_live_test.py +0 -0
  90. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/process_test.py +0 -0
  91. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/projects.py +0 -0
  92. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/projects_test.py +0 -0
  93. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/queue.py +0 -0
  94. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/queue_test.py +0 -0
  95. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/registry.py +0 -0
  96. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/registry_test.py +0 -0
  97. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/room.py +0 -0
  98. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/room_connect.py +0 -0
  99. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/room_connect_test.py +0 -0
  100. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/room_services.py +0 -0
  101. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/rooms.py +0 -0
  102. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/rooms_test.py +0 -0
  103. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/routes.py +0 -0
  104. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/scheduled_tasks.py +0 -0
  105. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/scheduled_tasks_test.py +0 -0
  106. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/services.py +0 -0
  107. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/services_test.py +0 -0
  108. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/sessions.py +0 -0
  109. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/sessions_test.py +0 -0
  110. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/storage.py +0 -0
  111. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/storage_test.py +0 -0
  112. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/subscriptions.py +0 -0
  113. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/sync.py +0 -0
  114. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/sync_test.py +0 -0
  115. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/task_runner.py +0 -0
  116. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/task_runner_test.py +0 -0
  117. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/test.py +0 -0
  118. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tool_call_summary.py +0 -0
  119. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tool_call_summary_test.py +0 -0
  120. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tool_integrations.py +0 -0
  121. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tool_integrations_test.py +0 -0
  122. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/__init__.py +0 -0
  123. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/auth_switch.py +0 -0
  124. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/auth_switch_test.py +0 -0
  125. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/create.py +0 -0
  126. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/deploy_room.py +0 -0
  127. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/deploy_room_test.py +0 -0
  128. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/project_activate.py +0 -0
  129. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/project_activate_test.py +0 -0
  130. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/setup.py +0 -0
  131. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  132. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/tui/setup_test.py +0 -0
  133. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/voicebot.py +0 -0
  134. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/webhook.py +0 -0
  135. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/webserver.py +0 -0
  136. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/webserver_test.py +0 -0
  137. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/worker.py +0 -0
  138. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent/cli/worker_test.py +0 -0
  139. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  140. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent_cli.egg-info/entry_points.txt +0 -0
  141. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/meshagent_cli.egg-info/top_level.txt +0 -0
  142. {meshagent_cli-0.41.5 → meshagent_cli-0.41.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.41.5
3
+ Version: 0.41.7
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.5
25
+ Requires-Dist: meshagent-llm-proxy==0.41.7
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.5; extra == "all"
34
- Requires-Dist: meshagent-api[all]==0.41.5; extra == "all"
35
- Requires-Dist: meshagent-commoncrawl==0.41.5; extra == "all"
36
- Requires-Dist: meshagent-scrapy==0.41.5; extra == "all"
37
- Requires-Dist: meshagent-computers==0.41.5; extra == "all"
38
- Requires-Dist: meshagent-openai==0.41.5; extra == "all"
39
- Requires-Dist: meshagent-anthropic==0.41.5; extra == "all"
40
- Requires-Dist: meshagent-otel==0.41.5; extra == "all"
41
- Requires-Dist: meshagent-mcp==0.41.5; extra == "all"
42
- Requires-Dist: meshagent-tools==0.41.5; extra == "all"
33
+ Requires-Dist: meshagent-agents[all]==0.41.7; extra == "all"
34
+ Requires-Dist: meshagent-api[all]==0.41.7; extra == "all"
35
+ Requires-Dist: meshagent-commoncrawl==0.41.7; extra == "all"
36
+ Requires-Dist: meshagent-scrapy==0.41.7; extra == "all"
37
+ Requires-Dist: meshagent-computers==0.41.7; extra == "all"
38
+ Requires-Dist: meshagent-openai==0.41.7; extra == "all"
39
+ Requires-Dist: meshagent-anthropic==0.41.7; extra == "all"
40
+ Requires-Dist: meshagent-otel==0.41.7; extra == "all"
41
+ Requires-Dist: meshagent-mcp==0.41.7; extra == "all"
42
+ Requires-Dist: meshagent-tools==0.41.7; 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.5; extra == "mcp-service"
47
- Requires-Dist: meshagent-api==0.41.5; extra == "mcp-service"
48
- Requires-Dist: meshagent-mcp==0.41.5; extra == "mcp-service"
49
- Requires-Dist: meshagent-tools==0.41.5; extra == "mcp-service"
46
+ Requires-Dist: meshagent-agents[all]==0.41.7; extra == "mcp-service"
47
+ Requires-Dist: meshagent-api==0.41.7; extra == "mcp-service"
48
+ Requires-Dist: meshagent-mcp==0.41.7; extra == "mcp-service"
49
+ Requires-Dist: meshagent-tools==0.41.7; extra == "mcp-service"
50
50
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
51
51
  Dynamic: license-file
52
52
 
@@ -2,12 +2,14 @@ from meshagent.cli import async_typer
2
2
 
3
3
  import logging
4
4
 
5
+ import click
5
6
  import os
6
7
  import sys
7
8
  import warnings
8
9
  from pathlib import Path
9
10
 
10
11
  from meshagent.cli.local_settings import apply_active_profile_api_url_environment
12
+ from meshagent.cli.version_check import warn_if_cli_out_of_date
11
13
 
12
14
 
13
15
  def _configure_warning_filters() -> None:
@@ -57,6 +59,10 @@ app = async_typer.LazyTyper(no_args_is_help=True, name="meshagent")
57
59
  def _root_callback() -> None:
58
60
  apply_active_profile_api_url_environment()
59
61
  _configure_runtime()
62
+ ctx = click.get_current_context(silent=True)
63
+ if ctx is not None and ctx.invoked_subcommand == "version":
64
+ return
65
+ warn_if_cli_out_of_date()
60
66
 
61
67
 
62
68
  app.add_lazy_command(
@@ -19,6 +19,8 @@ def _config_callback() -> None:
19
19
 
20
20
  def _config_value(config: MeshagentDeploymentConfig, path: str) -> str | None:
21
21
  match path:
22
+ case "version":
23
+ return config.version
22
24
  case "domains.studio":
23
25
  return config.domains.studio
24
26
  case "domains.accounts":
@@ -36,6 +38,7 @@ def _config_value(config: MeshagentDeploymentConfig, path: str) -> str | None:
36
38
  case _:
37
39
  supported_paths = ", ".join(
38
40
  [
41
+ "version",
39
42
  "domains.studio",
40
43
  "domains.accounts",
41
44
  "domains.powerboards",
@@ -39,6 +39,30 @@ def test_config_get_domains_pages_prints_pages_domain(
39
39
  assert fake_client.closed is True
40
40
 
41
41
 
42
+ def test_config_get_version_prints_server_version(
43
+ monkeypatch: pytest.MonkeyPatch,
44
+ capsys: pytest.CaptureFixture[str],
45
+ ) -> None:
46
+ fake_client = _FakeConfigClient(
47
+ MeshagentDeploymentConfig(
48
+ domains=MeshagentDomains(),
49
+ version="0.41.5",
50
+ )
51
+ )
52
+
53
+ async def _fake_get_client() -> _FakeConfigClient:
54
+ return fake_client
55
+
56
+ monkeypatch.setattr(config, "get_client", _fake_get_client)
57
+
58
+ cli.app(["config", "get", "version"])
59
+
60
+ captured = capsys.readouterr()
61
+ assert captured.out == "0.41.5\n"
62
+ assert captured.err == ""
63
+ assert fake_client.closed is True
64
+
65
+
42
66
  def test_config_get_rejects_unknown_path(
43
67
  monkeypatch: pytest.MonkeyPatch,
44
68
  capsys: pytest.CaptureFixture[str],
@@ -4,7 +4,9 @@ import click
4
4
  from rich import print
5
5
 
6
6
  from meshagent.api.client import User
7
+ from meshagent.cli.async_typer import _run_coroutine_sync
7
8
  from meshagent.cli.version import __version__
9
+ from meshagent.cli.version_check import get_server_version_best_effort
8
10
 
9
11
  _SETUP_WELCOME_PROMPT = (
10
12
  "welcome {user_name} to meshagent and let them know they can use "
@@ -58,7 +60,9 @@ def _current_meshagent_executable() -> str | None:
58
60
  help="Print the version",
59
61
  )
60
62
  def version_command():
61
- print(__version__)
63
+ server_version = _run_coroutine_sync(get_server_version_best_effort())
64
+ print(f"client: {__version__}")
65
+ print(f"server: {server_version or 'unavailable'}")
62
66
 
63
67
 
64
68
  @click.command("setup")
@@ -6,6 +6,52 @@ from meshagent.cli.local_settings import StoredUserProfile
6
6
  from meshagent.cli.tui.setup import SetupClaudeConfiguration, SetupWizardResult
7
7
 
8
8
 
9
+ def test_version_command_prints_client_and_server_versions(
10
+ monkeypatch,
11
+ capsys,
12
+ ) -> None:
13
+ async def _fake_get_server_version_best_effort() -> str | None:
14
+ return "0.42.0"
15
+
16
+ monkeypatch.setattr(
17
+ root_commands,
18
+ "get_server_version_best_effort",
19
+ _fake_get_server_version_best_effort,
20
+ )
21
+ monkeypatch.setattr(root_commands, "__version__", "0.41.5")
22
+
23
+ callback = root_commands.version_command.callback
24
+ assert callback is not None
25
+ callback()
26
+
27
+ captured = capsys.readouterr()
28
+ assert captured.out == "client: 0.41.5\nserver: 0.42.0\n"
29
+ assert captured.err == ""
30
+
31
+
32
+ def test_version_command_prints_unavailable_server_version(
33
+ monkeypatch,
34
+ capsys,
35
+ ) -> None:
36
+ async def _fake_get_server_version_best_effort() -> str | None:
37
+ return None
38
+
39
+ monkeypatch.setattr(
40
+ root_commands,
41
+ "get_server_version_best_effort",
42
+ _fake_get_server_version_best_effort,
43
+ )
44
+ monkeypatch.setattr(root_commands, "__version__", "0.41.5")
45
+
46
+ callback = root_commands.version_command.callback
47
+ assert callback is not None
48
+ callback()
49
+
50
+ captured = capsys.readouterr()
51
+ assert captured.out == "client: 0.41.5\nserver: unavailable\n"
52
+ assert captured.err == ""
53
+
54
+
9
55
  def test_setup_command_launches_ask_after_success(monkeypatch) -> None:
10
56
  launched: list[dict[str, object]] = []
11
57
  existing_codex_profile_requests: list[str] = []
@@ -0,0 +1 @@
1
+ __version__ = "0.41.7"
@@ -0,0 +1,106 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from typing import Any
5
+
6
+ from aiohttp import ClientTimeout
7
+ from rich.console import Console
8
+ from rich.markup import escape
9
+
10
+ from meshagent.api.http import new_client_session
11
+ from meshagent.cli.async_typer import _run_coroutine_sync
12
+ from meshagent.cli.local_settings import resolve_api_url
13
+ from meshagent.cli.version import __version__ as MESHAGENT_CLI_VERSION
14
+
15
+ _VERSION_CHECK_TIMEOUT_SECONDS = 1.5
16
+ _version_check_done = False
17
+
18
+
19
+ def _version_key(value: str) -> tuple[int, int, int] | None:
20
+ parts = value.strip().split(".")
21
+ if len(parts) < 2:
22
+ return None
23
+
24
+ parsed: list[int] = []
25
+ for part in parts[:3]:
26
+ digits = []
27
+ for char in part:
28
+ if not char.isdigit():
29
+ break
30
+ digits.append(char)
31
+ if not digits:
32
+ return None
33
+ parsed.append(int("".join(digits)))
34
+
35
+ while len(parsed) < 3:
36
+ parsed.append(0)
37
+ return tuple(parsed)
38
+
39
+
40
+ def _cli_is_behind_server(*, cli_version: str, server_version: str) -> bool:
41
+ cli_key = _version_key(cli_version)
42
+ server_key = _version_key(server_version)
43
+ if cli_key is None or server_key is None:
44
+ return False
45
+ return cli_key < server_key
46
+
47
+
48
+ def _server_version_from_config_payload(payload: Any) -> str | None:
49
+ if not isinstance(payload, dict):
50
+ return None
51
+ version = payload.get("version")
52
+ if not isinstance(version, str):
53
+ return None
54
+ normalized = version.strip()
55
+ if normalized == "":
56
+ return None
57
+ return normalized
58
+
59
+
60
+ async def _fetch_server_version() -> str | None:
61
+ timeout = ClientTimeout(total=_VERSION_CHECK_TIMEOUT_SECONDS)
62
+ async with new_client_session(timeout=timeout) as session:
63
+ async with session.get(f"{resolve_api_url()}/config") as response:
64
+ if response.status >= 400:
65
+ return None
66
+ return _server_version_from_config_payload(await response.json())
67
+
68
+
69
+ async def get_server_version_best_effort() -> str | None:
70
+ try:
71
+ return await _fetch_server_version()
72
+ except Exception:
73
+ return None
74
+
75
+
76
+ async def _maybe_warn_if_cli_out_of_date() -> None:
77
+ server_version = await get_server_version_best_effort()
78
+ if server_version is None:
79
+ return
80
+ if not _cli_is_behind_server(
81
+ cli_version=MESHAGENT_CLI_VERSION,
82
+ server_version=server_version,
83
+ ):
84
+ return
85
+
86
+ Console(stderr=True, width=200).print(
87
+ "[yellow]"
88
+ "Warning: this meshagent CLI is older than the server "
89
+ f"(CLI {escape(MESHAGENT_CLI_VERSION)}, server {escape(server_version)}). "
90
+ "Update meshagent to get the latest compatible behavior."
91
+ "[/yellow]"
92
+ )
93
+
94
+
95
+ def warn_if_cli_out_of_date() -> None:
96
+ global _version_check_done
97
+ if _version_check_done:
98
+ return
99
+ _version_check_done = True
100
+
101
+ if os.getenv("MESHAGENT_DISABLE_VERSION_CHECK") == "1":
102
+ return
103
+ if os.getenv("PYTEST_CURRENT_TEST") is not None:
104
+ return
105
+
106
+ _run_coroutine_sync(_maybe_warn_if_cli_out_of_date())
@@ -0,0 +1,58 @@
1
+ import pytest
2
+
3
+ from meshagent.cli import version_check
4
+
5
+
6
+ def test_cli_is_behind_server_compares_semver_prefixes() -> None:
7
+ assert version_check._cli_is_behind_server(
8
+ cli_version="0.41.5",
9
+ server_version="0.42.0",
10
+ )
11
+ assert not version_check._cli_is_behind_server(
12
+ cli_version="0.42.0",
13
+ server_version="0.41.5",
14
+ )
15
+ assert not version_check._cli_is_behind_server(
16
+ cli_version="0.42.0",
17
+ server_version="0.42.0",
18
+ )
19
+
20
+
21
+ @pytest.mark.asyncio
22
+ async def test_maybe_warn_if_cli_out_of_date_prints_yellow_warning(
23
+ monkeypatch: pytest.MonkeyPatch,
24
+ capsys: pytest.CaptureFixture[str],
25
+ ) -> None:
26
+ async def _fake_fetch_server_version() -> str:
27
+ return "0.42.0"
28
+
29
+ monkeypatch.setattr(
30
+ version_check, "_fetch_server_version", _fake_fetch_server_version
31
+ )
32
+ monkeypatch.setattr(version_check, "MESHAGENT_CLI_VERSION", "0.41.5")
33
+
34
+ await version_check._maybe_warn_if_cli_out_of_date()
35
+
36
+ captured = capsys.readouterr()
37
+ assert captured.out == ""
38
+ assert "Warning: this meshagent CLI is older than the server" in captured.err
39
+ assert "CLI 0.41.5, server 0.42.0" in captured.err
40
+
41
+
42
+ @pytest.mark.asyncio
43
+ async def test_maybe_warn_if_cli_out_of_date_ignores_fetch_errors(
44
+ monkeypatch: pytest.MonkeyPatch,
45
+ capsys: pytest.CaptureFixture[str],
46
+ ) -> None:
47
+ async def _fake_fetch_server_version() -> str:
48
+ raise RuntimeError("offline")
49
+
50
+ monkeypatch.setattr(
51
+ version_check, "_fetch_server_version", _fake_fetch_server_version
52
+ )
53
+
54
+ await version_check._maybe_warn_if_cli_out_of_date()
55
+
56
+ captured = capsys.readouterr()
57
+ assert captured.out == ""
58
+ assert captured.err == ""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.41.5
3
+ Version: 0.41.7
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.5
25
+ Requires-Dist: meshagent-llm-proxy==0.41.7
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.5; extra == "all"
34
- Requires-Dist: meshagent-api[all]==0.41.5; extra == "all"
35
- Requires-Dist: meshagent-commoncrawl==0.41.5; extra == "all"
36
- Requires-Dist: meshagent-scrapy==0.41.5; extra == "all"
37
- Requires-Dist: meshagent-computers==0.41.5; extra == "all"
38
- Requires-Dist: meshagent-openai==0.41.5; extra == "all"
39
- Requires-Dist: meshagent-anthropic==0.41.5; extra == "all"
40
- Requires-Dist: meshagent-otel==0.41.5; extra == "all"
41
- Requires-Dist: meshagent-mcp==0.41.5; extra == "all"
42
- Requires-Dist: meshagent-tools==0.41.5; extra == "all"
33
+ Requires-Dist: meshagent-agents[all]==0.41.7; extra == "all"
34
+ Requires-Dist: meshagent-api[all]==0.41.7; extra == "all"
35
+ Requires-Dist: meshagent-commoncrawl==0.41.7; extra == "all"
36
+ Requires-Dist: meshagent-scrapy==0.41.7; extra == "all"
37
+ Requires-Dist: meshagent-computers==0.41.7; extra == "all"
38
+ Requires-Dist: meshagent-openai==0.41.7; extra == "all"
39
+ Requires-Dist: meshagent-anthropic==0.41.7; extra == "all"
40
+ Requires-Dist: meshagent-otel==0.41.7; extra == "all"
41
+ Requires-Dist: meshagent-mcp==0.41.7; extra == "all"
42
+ Requires-Dist: meshagent-tools==0.41.7; 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.5; extra == "mcp-service"
47
- Requires-Dist: meshagent-api==0.41.5; extra == "mcp-service"
48
- Requires-Dist: meshagent-mcp==0.41.5; extra == "mcp-service"
49
- Requires-Dist: meshagent-tools==0.41.5; extra == "mcp-service"
46
+ Requires-Dist: meshagent-agents[all]==0.41.7; extra == "mcp-service"
47
+ Requires-Dist: meshagent-api==0.41.7; extra == "mcp-service"
48
+ Requires-Dist: meshagent-mcp==0.41.7; extra == "mcp-service"
49
+ Requires-Dist: meshagent-tools==0.41.7; extra == "mcp-service"
50
50
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
51
51
  Dynamic: license-file
52
52
 
@@ -106,6 +106,8 @@ meshagent/cli/tool_call_summary_test.py
106
106
  meshagent/cli/tool_integrations.py
107
107
  meshagent/cli/tool_integrations_test.py
108
108
  meshagent/cli/version.py
109
+ meshagent/cli/version_check.py
110
+ meshagent/cli/version_check_test.py
109
111
  meshagent/cli/voicebot.py
110
112
  meshagent/cli/webhook.py
111
113
  meshagent/cli/webserver.py
@@ -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.5
14
+ meshagent-llm-proxy==0.41.7
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.5
24
- meshagent-api[all]==0.41.5
25
- meshagent-commoncrawl==0.41.5
26
- meshagent-scrapy==0.41.5
27
- meshagent-computers==0.41.5
28
- meshagent-openai==0.41.5
29
- meshagent-anthropic==0.41.5
30
- meshagent-otel==0.41.5
31
- meshagent-mcp==0.41.5
32
- meshagent-tools==0.41.5
23
+ meshagent-agents[all]==0.41.7
24
+ meshagent-api[all]==0.41.7
25
+ meshagent-commoncrawl==0.41.7
26
+ meshagent-scrapy==0.41.7
27
+ meshagent-computers==0.41.7
28
+ meshagent-openai==0.41.7
29
+ meshagent-anthropic==0.41.7
30
+ meshagent-otel==0.41.7
31
+ meshagent-mcp==0.41.7
32
+ meshagent-tools==0.41.7
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.5
38
- meshagent-api==0.41.5
39
- meshagent-mcp==0.41.5
40
- meshagent-tools==0.41.5
37
+ meshagent-agents[all]==0.41.7
38
+ meshagent-api==0.41.7
39
+ meshagent-mcp==0.41.7
40
+ meshagent-tools==0.41.7
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.5",
25
+ "meshagent-llm-proxy==0.41.7",
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.5",
40
- "meshagent-api[all]==0.41.5",
41
- "meshagent-commoncrawl==0.41.5",
42
- "meshagent-scrapy==0.41.5",
43
- "meshagent-computers==0.41.5",
44
- "meshagent-openai==0.41.5",
45
- "meshagent-anthropic==0.41.5",
46
- "meshagent-otel==0.41.5",
47
- "meshagent-mcp==0.41.5",
48
- "meshagent-tools==0.41.5",
39
+ "meshagent-agents[all]==0.41.7",
40
+ "meshagent-api[all]==0.41.7",
41
+ "meshagent-commoncrawl==0.41.7",
42
+ "meshagent-scrapy==0.41.7",
43
+ "meshagent-computers==0.41.7",
44
+ "meshagent-openai==0.41.7",
45
+ "meshagent-anthropic==0.41.7",
46
+ "meshagent-otel==0.41.7",
47
+ "meshagent-mcp==0.41.7",
48
+ "meshagent-tools==0.41.7",
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.5",
55
- "meshagent-api==0.41.5",
56
- "meshagent-mcp==0.41.5",
57
- "meshagent-tools==0.41.5",
54
+ "meshagent-agents[all]==0.41.7",
55
+ "meshagent-api==0.41.7",
56
+ "meshagent-mcp==0.41.7",
57
+ "meshagent-tools==0.41.7",
58
58
  "supabase-auth~=2.28.0"
59
59
  ]
60
60
 
@@ -1 +0,0 @@
1
- __version__ = "0.41.5"
File without changes
File without changes
File without changes