meshagent-cli 0.44.10__tar.gz → 0.44.12__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 (150) hide show
  1. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/PKG-INFO +17 -17
  2. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/agent.py +1 -0
  3. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/agent_cli_options_test.py +1 -1
  4. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/ask_test.py +1 -1
  5. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/async_typer_test.py +1 -1
  6. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/chatbot.py +2 -2
  7. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/cli_mcp.py +4 -4
  8. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/cli_test.py +1 -1
  9. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/create.py +118 -29
  10. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/create_project_templates/python/backend-agent/server.py +2 -2
  11. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/create_project_templates/python/contact-form/server.py +298 -9
  12. meshagent_cli-0.44.12/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +707 -0
  13. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/create_project_templates/python/webserver/server.py +15 -2
  14. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/create_test.py +878 -114
  15. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/dataset_test.py +1 -1
  16. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/doctor_test.py +5 -13
  17. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/image.py +120 -7
  18. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/image_test.py +224 -4
  19. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/launch_test.py +1 -1
  20. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/llm_test.py +1 -1
  21. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/messaging.py +14 -2
  22. meshagent_cli-0.44.12/meshagent/cli/messaging_test.py +36 -0
  23. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/process.py +2 -2
  24. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/registry_test.py +1 -1
  25. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/room_connect.py +135 -3
  26. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/room_connect_test.py +302 -2
  27. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/rooms_test.py +1 -1
  28. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/services_test.py +1 -1
  29. meshagent_cli-0.44.12/meshagent/cli/sessions.py +663 -0
  30. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/sessions_test.py +275 -0
  31. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/test.py +2 -2
  32. meshagent_cli-0.44.12/meshagent/cli/testing.py +107 -0
  33. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/create.py +140 -10
  34. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/deploy_room.py +44 -13
  35. meshagent_cli-0.44.12/meshagent/cli/version.py +1 -0
  36. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent_cli.egg-info/PKG-INFO +17 -17
  37. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent_cli.egg-info/SOURCES.txt +3 -0
  38. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent_cli.egg-info/requires.txt +16 -16
  39. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/pyproject.toml +16 -16
  40. meshagent_cli-0.44.10/meshagent/cli/sessions.py +0 -349
  41. meshagent_cli-0.44.10/meshagent/cli/version.py +0 -1
  42. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/LICENSE +0 -0
  43. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/README.md +0 -0
  44. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/__init__.py +0 -0
  45. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/_filedrop.py +0 -0
  46. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/agent_package_cli.py +0 -0
  47. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/agent_package_cli_test.py +0 -0
  48. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/agents.py +0 -0
  49. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/agents_test.py +0 -0
  50. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/api_keys.py +0 -0
  51. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/api_keys_test.py +0 -0
  52. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/ask.py +0 -0
  53. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/async_typer.py +0 -0
  54. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/auth.py +0 -0
  55. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/auth_async.py +0 -0
  56. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/auth_async_test.py +0 -0
  57. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/auth_test.py +0 -0
  58. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/call.py +0 -0
  59. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/cli.py +0 -0
  60. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/cli_secrets.py +0 -0
  61. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/common_options.py +0 -0
  62. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/config.py +0 -0
  63. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/config_test.py +0 -0
  64. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/containers.py +0 -0
  65. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/containers_test.py +0 -0
  66. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/create_project_templates/__init__.py +0 -0
  67. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/dataset.py +0 -0
  68. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/developer.py +0 -0
  69. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/developer_test.py +0 -0
  70. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/doctor.py +0 -0
  71. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  72. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/doctor_templates/__init__.py +0 -0
  73. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/feeds.py +0 -0
  74. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/helper.py +0 -0
  75. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/helper_test.py +0 -0
  76. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/helpers.py +0 -0
  77. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/host.py +0 -0
  78. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/launch.py +0 -0
  79. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/llm.py +0 -0
  80. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/local_settings.py +0 -0
  81. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/local_settings_test.py +0 -0
  82. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/mailbot.py +0 -0
  83. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/mailbot_test.py +0 -0
  84. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/mailboxes.py +0 -0
  85. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/meeting_transcriber.py +0 -0
  86. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/memory.py +0 -0
  87. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/memory_test.py +0 -0
  88. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/meshagent_images.py +0 -0
  89. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/meshagent_images_test.py +0 -0
  90. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/multi.py +0 -0
  91. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/oauth2.py +0 -0
  92. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/oauth2_test.py +0 -0
  93. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/oci_archive.py +0 -0
  94. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/oci_archive_test.py +0 -0
  95. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/participant_token.py +0 -0
  96. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/port.py +0 -0
  97. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/port_test.py +0 -0
  98. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/preamble_rules.py +0 -0
  99. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/preamble_rules_test.py +0 -0
  100. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/process_live_test.py +0 -0
  101. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/process_test.py +0 -0
  102. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/projects.py +0 -0
  103. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/projects_test.py +0 -0
  104. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/queue.py +0 -0
  105. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/queue_test.py +0 -0
  106. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/registry.py +0 -0
  107. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/room.py +0 -0
  108. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/room_services.py +0 -0
  109. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/rooms.py +0 -0
  110. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/root_commands.py +0 -0
  111. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/root_commands_test.py +0 -0
  112. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/routes.py +0 -0
  113. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/scheduled_tasks.py +0 -0
  114. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/scheduled_tasks_test.py +0 -0
  115. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/services.py +0 -0
  116. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/storage.py +0 -0
  117. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/storage_test.py +0 -0
  118. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/subscriptions.py +0 -0
  119. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/sync.py +0 -0
  120. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/sync_test.py +0 -0
  121. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/task_runner.py +0 -0
  122. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/task_runner_test.py +0 -0
  123. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/thread_inspect.py +0 -0
  124. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/thread_inspect_test.py +0 -0
  125. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/thread_sidebar.py +0 -0
  126. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tool_call_summary.py +0 -0
  127. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tool_call_summary_test.py +0 -0
  128. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tool_integrations.py +0 -0
  129. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tool_integrations_test.py +0 -0
  130. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/__init__.py +0 -0
  131. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/auth_switch.py +0 -0
  132. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/auth_switch_test.py +0 -0
  133. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/deploy_room_test.py +0 -0
  134. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/project_activate.py +0 -0
  135. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/project_activate_test.py +0 -0
  136. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/setup.py +0 -0
  137. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  138. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/tui/setup_test.py +0 -0
  139. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/version_check.py +0 -0
  140. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/version_check_test.py +0 -0
  141. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/voicebot.py +0 -0
  142. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/webhook.py +0 -0
  143. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/webserver.py +0 -0
  144. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/webserver_test.py +0 -0
  145. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/worker.py +0 -0
  146. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent/cli/worker_test.py +0 -0
  147. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  148. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent_cli.egg-info/entry_points.txt +0 -0
  149. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/meshagent_cli.egg-info/top_level.txt +0 -0
  150. {meshagent_cli-0.44.10 → meshagent_cli-0.44.12}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.44.10
3
+ Version: 0.44.12
4
4
  Summary: CLI for Meshagent
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Documentation, https://docs.meshagent.com
@@ -22,8 +22,8 @@ Requires-Dist: openpyxl~=3.1
22
22
  Requires-Dist: xlsxwriter~=3.2
23
23
  Requires-Dist: pathspec<2,>=1.0.3
24
24
  Requires-Dist: zstandard~=0.25.0
25
- Requires-Dist: meshagent-llm-proxy==0.44.10
26
- Requires-Dist: meshagent-codex==0.44.10
25
+ Requires-Dist: meshagent-llm-proxy==0.44.12
26
+ Requires-Dist: meshagent-codex==0.44.12
27
27
  Requires-Dist: rich~=14.3.0
28
28
  Requires-Dist: sounddevice~=0.5
29
29
  Requires-Dist: textual<9.0,>=8.2.3
@@ -32,23 +32,23 @@ Requires-Dist: prompt-toolkit~=3.0.52
32
32
  Requires-Dist: ascii-magic~=2.3
33
33
  Requires-Dist: pillow~=11.3.0
34
34
  Provides-Extra: all
35
- Requires-Dist: meshagent-agents[all]==0.44.10; extra == "all"
36
- Requires-Dist: meshagent-api[all]==0.44.10; extra == "all"
37
- Requires-Dist: meshagent-commoncrawl==0.44.10; extra == "all"
38
- Requires-Dist: meshagent-scrapy==0.44.10; extra == "all"
39
- Requires-Dist: meshagent-computers==0.44.10; extra == "all"
40
- Requires-Dist: meshagent-openai==0.44.10; extra == "all"
41
- Requires-Dist: meshagent-anthropic==0.44.10; extra == "all"
42
- Requires-Dist: meshagent-otel==0.44.10; extra == "all"
43
- Requires-Dist: meshagent-mcp==0.44.10; extra == "all"
44
- Requires-Dist: meshagent-tools==0.44.10; extra == "all"
35
+ Requires-Dist: meshagent-agents[all]==0.44.12; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.44.12; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.44.12; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.44.12; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.44.12; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.44.12; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.44.12; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.44.12; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.44.12; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.44.12; extra == "all"
45
45
  Requires-Dist: supabase-auth~=2.28.0; extra == "all"
46
46
  Requires-Dist: prompt-toolkit~=3.0.52; extra == "all"
47
47
  Provides-Extra: mcp-service
48
- Requires-Dist: meshagent-agents[all]==0.44.10; extra == "mcp-service"
49
- Requires-Dist: meshagent-api==0.44.10; extra == "mcp-service"
50
- Requires-Dist: meshagent-mcp==0.44.10; extra == "mcp-service"
51
- Requires-Dist: meshagent-tools==0.44.10; extra == "mcp-service"
48
+ Requires-Dist: meshagent-agents[all]==0.44.12; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.44.12; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.44.12; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.44.12; extra == "mcp-service"
52
52
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
53
53
  Dynamic: license-file
54
54
 
@@ -157,6 +157,7 @@ async def list_toolkits_command(
157
157
  "name": tk.name,
158
158
  "title": tk.title,
159
159
  "description": tk.description,
160
+ "annotations": tk.annotations,
160
161
  "tools": [
161
162
  {
162
163
  "name": tool.name,
@@ -1,4 +1,4 @@
1
- from typer._click.testing import CliRunner
1
+ from meshagent.cli.testing import CliRunner
2
2
  import pytest
3
3
 
4
4
  from meshagent.cli import async_typer
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
 
7
7
  import pytest
8
8
  import typer
9
- from typer._click.testing import CliRunner
9
+ from meshagent.cli.testing import CliRunner
10
10
  from PIL import Image
11
11
 
12
12
  from meshagent.agents import AgentSessionContext
@@ -2,7 +2,7 @@ import importlib
2
2
  import types
3
3
 
4
4
  import typer
5
- from typer._click.testing import CliRunner
5
+ from meshagent.cli.testing import CliRunner
6
6
 
7
7
  from meshagent.cli import async_typer
8
8
 
@@ -2019,7 +2019,7 @@ def build_process_agent(
2019
2019
  from meshagent.agents.messages import TurnStart, TurnSteer
2020
2020
  from meshagent.agents.process import AgentSupervisor, LLMAgentProcess
2021
2021
  from meshagent.tools import RoomToolContext, Toolkit
2022
- from meshagent.tools.hosting import _RemoteToolkitWrapper, _start_hosted_toolkit
2022
+ from meshagent.tools.hosting import _RemoteToolkitWrapper, start_hosted_toolkit
2023
2023
 
2024
2024
  requirements = []
2025
2025
  toolkits = []
@@ -2284,7 +2284,7 @@ def build_process_agent(
2284
2284
 
2285
2285
  self._exposed_toolkits = await self.get_exposed_toolkits()
2286
2286
  for toolkit in self._exposed_toolkits:
2287
- hosted_toolkit = await _start_hosted_toolkit(
2287
+ hosted_toolkit = await start_hosted_toolkit(
2288
2288
  room=room,
2289
2289
  toolkit=toolkit,
2290
2290
  )
@@ -13,7 +13,7 @@ from meshagent.cli import async_typer
13
13
  from meshagent.cli.helper import resolve_project_id, resolve_room, resolve_key
14
14
 
15
15
  from meshagent.tools import Toolkit
16
- from meshagent.tools.hosting import _start_hosted_toolkit
16
+ from meshagent.tools.hosting import start_hosted_toolkit
17
17
 
18
18
 
19
19
  from meshagent.api.services import ServiceHost
@@ -203,7 +203,7 @@ async def sse(
203
203
  description=toolkit.description,
204
204
  )
205
205
 
206
- hosted_toolkit = await _start_hosted_toolkit(
206
+ hosted_toolkit = await start_hosted_toolkit(
207
207
  room=client,
208
208
  toolkit=toolkit,
209
209
  )
@@ -320,7 +320,7 @@ async def streamable_http(
320
320
  description=toolkit.description,
321
321
  )
322
322
 
323
- hosted_toolkit = await _start_hosted_toolkit(
323
+ hosted_toolkit = await start_hosted_toolkit(
324
324
  room=client,
325
325
  toolkit=toolkit,
326
326
  )
@@ -422,7 +422,7 @@ async def stdio(
422
422
  description=toolkit.description,
423
423
  )
424
424
 
425
- hosted_toolkit = await _start_hosted_toolkit(
425
+ hosted_toolkit = await start_hosted_toolkit(
426
426
  room=client,
427
427
  toolkit=toolkit,
428
428
  )
@@ -3,7 +3,7 @@ import sys
3
3
  import types
4
4
 
5
5
  import pytest
6
- from typer._click.testing import CliRunner
6
+ from meshagent.cli.testing import CliRunner
7
7
 
8
8
  from meshagent.api import RoomException
9
9
  from meshagent.cli import async_typer
@@ -65,6 +65,7 @@ CHATBOT_UI_FOCUS = "chatbot-ui"
65
65
  ROOM_CHAT_FOCUS = "room-chat"
66
66
  ROOM_WORKSPACE_FOCUS = "room-workspace"
67
67
  CONTACT_FORM_FOCUS = "contact-form"
68
+ TASK_QUEUE_DASHBOARD_FOCUS = "task-queue-dashboard"
68
69
  DEFAULT_LANGUAGE = "python"
69
70
  DEFAULT_FOCUS = AGENT_FOCUS
70
71
  CREATE_TEMPLATE_PACKAGE = "meshagent.cli.create_project_templates"
@@ -116,29 +117,35 @@ AGENT_NEXT_STEPS = (
116
117
  "./scripts/dev.sh",
117
118
  "./scripts/deploy.sh",
118
119
  )
120
+ PYTHON_WEBSERVER_NEXT_STEPS = (
121
+ "./scripts/dev.sh",
122
+ "./scripts/deploy.sh",
123
+ )
124
+ PYTHON_AGENT_NEXT_STEPS = (
125
+ "./scripts/dev.sh",
126
+ "./scripts/deploy.sh",
127
+ )
119
128
  NPM_WEBSERVER_NEXT_STEPS = (
120
- "npm install",
121
129
  "npm run dev",
122
130
  "npm run deploy",
123
131
  )
124
132
  NPM_STATIC_WEBSERVER_NEXT_STEPS = (
125
- "npm install",
126
133
  "npm run dev",
127
134
  "npm run deploy",
128
135
  )
129
136
  NPM_CHATBOT_UI_NEXT_STEPS = (
130
- "npm install",
131
137
  "npm run dev",
132
138
  "npm run deploy",
133
139
  )
134
140
  CONTACT_FORM_NEXT_STEPS = (
135
- "./scripts/install.sh",
136
- "meshagent rooms create <room> --if-not-exists",
137
- "./scripts/dev.sh --room <room>",
138
- "CONTACT_FORM_TO=you@example.com ./scripts/deploy.sh --room <room>",
141
+ "./scripts/dev.sh",
142
+ "CONTACT_FORM_TO=you@example.com ./scripts/deploy.sh",
143
+ )
144
+ TASK_QUEUE_DASHBOARD_NEXT_STEPS = (
145
+ "./scripts/dev.sh",
146
+ "./scripts/deploy.sh",
139
147
  )
140
148
  NPM_AGENT_NEXT_STEPS = (
141
- "npm install",
142
149
  "npm run dev",
143
150
  "npm run deploy",
144
151
  )
@@ -256,6 +263,11 @@ FOCUSES: Mapping[str, CreateFocus] = {
256
263
  label="Contact Form",
257
264
  description="Public HTML contact form that sends email through a room mailbox.",
258
265
  ),
266
+ TASK_QUEUE_DASHBOARD_FOCUS: CreateFocus(
267
+ id=TASK_QUEUE_DASHBOARD_FOCUS,
268
+ label="Task Queue Dashboard",
269
+ description="Public dashboard backed by a scheduled queue worker.",
270
+ ),
259
271
  }
260
272
 
261
273
 
@@ -270,7 +282,7 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
270
282
  label="Python Web App",
271
283
  description="Async Python public HTTP service with a health route.",
272
284
  template_dir=_template_dir("python", WEB_FOCUS),
273
- next_steps=WEBSERVER_NEXT_STEPS,
285
+ next_steps=PYTHON_WEBSERVER_NEXT_STEPS,
274
286
  ),
275
287
  ("python", AGENT_FOCUS): CreateTemplate(
276
288
  language_id="python",
@@ -278,7 +290,7 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
278
290
  label="Python Agent Toolkit",
279
291
  description="Headless Python service that exposes custom tools to agents.",
280
292
  template_dir=_template_dir("python", AGENT_FOCUS),
281
- next_steps=AGENT_NEXT_STEPS,
293
+ next_steps=PYTHON_AGENT_NEXT_STEPS,
282
294
  ),
283
295
  ("python", CONTACT_FORM_FOCUS): CreateTemplate(
284
296
  language_id="python",
@@ -288,6 +300,14 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
288
300
  template_dir=_template_dir("python", CONTACT_FORM_FOCUS),
289
301
  next_steps=CONTACT_FORM_NEXT_STEPS,
290
302
  ),
303
+ ("python", TASK_QUEUE_DASHBOARD_FOCUS): CreateTemplate(
304
+ language_id="python",
305
+ focus_id=TASK_QUEUE_DASHBOARD_FOCUS,
306
+ label="Python Task Queue Dashboard",
307
+ description="Python dashboard that schedules text work onto a room queue.",
308
+ template_dir=_template_dir("python", TASK_QUEUE_DASHBOARD_FOCUS),
309
+ next_steps=TASK_QUEUE_DASHBOARD_NEXT_STEPS,
310
+ ),
291
311
  ("javascript", WEB_FOCUS): CreateTemplate(
292
312
  language_id="javascript",
293
313
  focus_id=WEB_FOCUS,
@@ -469,6 +489,19 @@ FOCUS_ALIASES = {
469
489
  "email": CONTACT_FORM_FOCUS,
470
490
  "email-form": CONTACT_FORM_FOCUS,
471
491
  "email_form": CONTACT_FORM_FOCUS,
492
+ "queue": TASK_QUEUE_DASHBOARD_FOCUS,
493
+ "queue-dashboard": TASK_QUEUE_DASHBOARD_FOCUS,
494
+ "queue_dashboard": TASK_QUEUE_DASHBOARD_FOCUS,
495
+ "scheduled-queue": TASK_QUEUE_DASHBOARD_FOCUS,
496
+ "scheduled_queue": TASK_QUEUE_DASHBOARD_FOCUS,
497
+ "scheduled-task": TASK_QUEUE_DASHBOARD_FOCUS,
498
+ "scheduled_task": TASK_QUEUE_DASHBOARD_FOCUS,
499
+ "scheduled-task-queue": TASK_QUEUE_DASHBOARD_FOCUS,
500
+ "scheduled_task_queue": TASK_QUEUE_DASHBOARD_FOCUS,
501
+ "task-queue": TASK_QUEUE_DASHBOARD_FOCUS,
502
+ "task_queue": TASK_QUEUE_DASHBOARD_FOCUS,
503
+ "task-queue-dashboard": TASK_QUEUE_DASHBOARD_FOCUS,
504
+ "task_queue_dashboard": TASK_QUEUE_DASHBOARD_FOCUS,
472
505
  "roomclient": AGENT_FOCUS,
473
506
  "room-client": AGENT_FOCUS,
474
507
  "web": WEB_FOCUS,
@@ -658,16 +691,64 @@ def _language_choices() -> Sequence[tuple[str, str, str, tuple[str, ...]]]:
658
691
  )
659
692
 
660
693
 
661
- def _focus_choices() -> Sequence[tuple[str, str, str]]:
694
+ def _first_explanatory_readme_paragraph(markdown: str) -> str | None:
695
+ paragraph_lines: list[str] = []
696
+ in_fenced_block = False
697
+
698
+ for raw_line in markdown.splitlines():
699
+ line = raw_line.strip()
700
+ if line.startswith("```") or line.startswith("~~~"):
701
+ in_fenced_block = not in_fenced_block
702
+ continue
703
+ if in_fenced_block:
704
+ continue
705
+ if line == "":
706
+ if paragraph_lines:
707
+ break
708
+ continue
709
+ if line.startswith("#"):
710
+ if paragraph_lines:
711
+ break
712
+ continue
713
+
714
+ paragraph_lines.append(line)
715
+
716
+ if not paragraph_lines:
717
+ return None
718
+ return " ".join(" ".join(paragraph_lines).split())
719
+
720
+
721
+ def _template_choice_description(template: CreateTemplate) -> str:
722
+ try:
723
+ readme = _read_create_template(f"{template.template_dir}/README.md")
724
+ except FileNotFoundError:
725
+ return template.description
726
+
727
+ return _first_explanatory_readme_paragraph(readme) or template.description
728
+
729
+
730
+ def _focus_choices() -> Sequence[tuple[str, str, str, tuple[tuple[str, str], ...]]]:
662
731
  return tuple(
663
- (focus.id, focus.label, focus.description) for focus in FOCUSES.values()
732
+ (
733
+ focus.id,
734
+ focus.label,
735
+ focus.description,
736
+ tuple(
737
+ (template.language_id, _template_choice_description(template))
738
+ for template in TEMPLATES.values()
739
+ if template.focus_id == focus.id
740
+ ),
741
+ )
742
+ for focus in FOCUSES.values()
664
743
  )
665
744
 
666
745
 
667
746
  def _run_create_tui(
668
747
  *,
669
748
  language_choices: Sequence[tuple[str, str, str, tuple[str, ...]]],
670
- focus_choices: Sequence[tuple[str, str, str]],
749
+ focus_choices: Sequence[
750
+ tuple[str, str, str, Sequence[tuple[str, str]]] | tuple[str, str, str]
751
+ ],
671
752
  ) -> tuple[str, str] | None:
672
753
  from meshagent.cli.tui.create import (
673
754
  CreateFocusChoice,
@@ -685,8 +766,15 @@ def _run_create_tui(
685
766
  for language_id, label, description, focus_ids in language_choices
686
767
  ]
687
768
  focuses = [
688
- CreateFocusChoice(id=focus_id, label=label, description=description)
689
- for focus_id, label, description in focus_choices
769
+ CreateFocusChoice(
770
+ id=focus_id,
771
+ label=label,
772
+ description=description,
773
+ descriptions_by_language=tuple(descriptions_by_language),
774
+ )
775
+ for focus_id, label, description, descriptions_by_language in (
776
+ (*choice, ()) if len(choice) == 3 else choice for choice in focus_choices
777
+ )
690
778
  ]
691
779
  result = asyncio.run(run_create_wizard_tui(languages=languages, focuses=focuses))
692
780
  if result.status != "completed":
@@ -812,30 +900,31 @@ def _print_agent_toolkit_guidance(template: CreateTemplate) -> None:
812
900
  typer.secho(f" {command}", fg="green")
813
901
 
814
902
 
815
- def _print_contact_form_mailbox_guidance(template: CreateTemplate) -> None:
903
+ def _print_contact_form_email_guidance(template: CreateTemplate) -> None:
816
904
  if template.focus_id != CONTACT_FORM_FOCUS:
817
905
  return
818
906
  typer.echo("")
819
907
  typer.secho(
820
- "Before testing a submission, set up the sender mailbox for that room:",
908
+ "Email setup is handled by the deploy template:",
821
909
  fg="cyan",
822
910
  bold=True,
823
911
  )
824
- typer.echo(" New mailbox:")
825
- typer.secho(
826
- " meshagent mailbox create --address contact-<room-slug>@mail.meshagent.com --room <room> --queue contact-<room-slug>@mail.meshagent.com --public",
827
- fg="green",
912
+ typer.echo(
913
+ " .meshagent/deploy.yaml injects CONTACT_FORM_FROM and CONTACT_FORM_TO into the service."
828
914
  )
829
- typer.echo(" Existing mailbox for that room:")
830
- typer.secho(
831
- " meshagent mailbox update contact-<room-slug>@mail.meshagent.com --room <room> --queue contact-<room-slug>@mail.meshagent.com --public",
832
- fg="green",
915
+ typer.echo(
916
+ " meshagent deploy creates or updates the public sender mailbox from CONTACT_FORM_FROM."
917
+ )
918
+ typer.echo(
919
+ " meshagent deploy prompts for the sender mailbox when CONTACT_FORM_FROM is not set."
833
920
  )
834
921
  typer.echo(
835
- "Use that mailbox as CONTACT_FORM_FROM. If create returns 409, choose another room-specific local part; do not reuse a mailbox unless it is listed for this room. Set CONTACT_FORM_TO to the address that should receive submissions."
922
+ "Set CONTACT_FORM_TO to the address that should receive submissions. "
923
+ "Set CONTACT_FORM_FROM only when you want a specific sender mailbox on "
924
+ "the MeshAgent mail domain."
836
925
  )
837
926
  typer.echo(
838
- "If CONTACT_FORM_TO is also a private MeshAgent mailbox, use a public destination mailbox or an external delivery alias."
927
+ "If deploy reports that the sender mailbox already routes to a different room, choose another room-specific local part."
839
928
  )
840
929
 
841
930
 
@@ -851,7 +940,7 @@ def _print_created_report(
851
940
  typer.echo("")
852
941
  _print_next_steps(template.next_steps, enter_project_root=enter_project_root)
853
942
  _print_agent_toolkit_guidance(template)
854
- _print_contact_form_mailbox_guidance(template)
943
+ _print_contact_form_email_guidance(template)
855
944
 
856
945
 
857
946
  app = async_typer.AsyncTyper(add_completion=False)
@@ -885,7 +974,7 @@ def _create_command(
885
974
  "Project focus for non-interactive use. Use stable IDs: webserver "
886
975
  "(Web App), backend-agent (Agent Toolkit), chatbot (OpenAI Chatbot), "
887
976
  "chatbot-anthropic (Anthropic Chatbot), chatbot-ui (Agent UI), "
888
- "room-chat (Room Chat), meeting-app (Meeting App), or "
977
+ "room-chat (Room Chat), room-workspace (Room Workspace), or "
889
978
  "contact-form (Contact Form)."
890
979
  ),
891
980
  ),
@@ -9,7 +9,7 @@ import aiofiles
9
9
  import aiofiles.os
10
10
  from meshagent.api import RoomClient, WebSocketClientProtocol, websocket_room_url
11
11
  from meshagent.tools import FunctionTool, Toolkit, ToolContext
12
- from meshagent.tools.hosting import _start_hosted_toolkit
12
+ from meshagent.tools.hosting import start_hosted_toolkit
13
13
 
14
14
 
15
15
  PROOF_PATH = Path(__file__).with_name("agent-proof.json")
@@ -108,7 +108,7 @@ async def main() -> None:
108
108
 
109
109
  async def run_agent_toolkit_proof(room: RoomClient) -> None:
110
110
  probe = os.environ.get("MESHAGENT_CREATE_DEV_PROBE")
111
- hosted_toolkit = await _start_hosted_toolkit(
111
+ hosted_toolkit = await start_hosted_toolkit(
112
112
  room=room,
113
113
  toolkit=PythonAgentToolkit(),
114
114
  )