meshagent-cli 0.44.10__tar.gz → 0.44.11__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 (148) hide show
  1. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/PKG-INFO +17 -17
  2. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/agent_cli_options_test.py +1 -1
  3. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/ask_test.py +1 -1
  4. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/async_typer_test.py +1 -1
  5. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/cli_test.py +1 -1
  6. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/create.py +118 -29
  7. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/create_project_templates/python/contact-form/server.py +298 -9
  8. meshagent_cli-0.44.11/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +707 -0
  9. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/create_project_templates/python/webserver/server.py +13 -0
  10. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/create_test.py +876 -112
  11. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/dataset_test.py +1 -1
  12. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/doctor_test.py +5 -13
  13. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/image.py +120 -7
  14. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/image_test.py +224 -4
  15. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/launch_test.py +1 -1
  16. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/llm_test.py +1 -1
  17. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/registry_test.py +1 -1
  18. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/room_connect.py +135 -3
  19. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/room_connect_test.py +302 -2
  20. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/rooms_test.py +1 -1
  21. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/services_test.py +1 -1
  22. meshagent_cli-0.44.11/meshagent/cli/testing.py +107 -0
  23. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/create.py +140 -10
  24. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/deploy_room.py +44 -13
  25. meshagent_cli-0.44.11/meshagent/cli/version.py +1 -0
  26. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent_cli.egg-info/PKG-INFO +17 -17
  27. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent_cli.egg-info/SOURCES.txt +2 -0
  28. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent_cli.egg-info/requires.txt +16 -16
  29. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/pyproject.toml +16 -16
  30. meshagent_cli-0.44.10/meshagent/cli/version.py +0 -1
  31. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/LICENSE +0 -0
  32. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/README.md +0 -0
  33. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/__init__.py +0 -0
  34. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/_filedrop.py +0 -0
  35. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/agent.py +0 -0
  36. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/agent_package_cli.py +0 -0
  37. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/agent_package_cli_test.py +0 -0
  38. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/agents.py +0 -0
  39. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/agents_test.py +0 -0
  40. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/api_keys.py +0 -0
  41. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/api_keys_test.py +0 -0
  42. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/ask.py +0 -0
  43. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/async_typer.py +0 -0
  44. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/auth.py +0 -0
  45. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/auth_async.py +0 -0
  46. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/auth_async_test.py +0 -0
  47. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/auth_test.py +0 -0
  48. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/call.py +0 -0
  49. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/chatbot.py +0 -0
  50. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/cli.py +0 -0
  51. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/cli_mcp.py +0 -0
  52. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/cli_secrets.py +0 -0
  53. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/common_options.py +0 -0
  54. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/config.py +0 -0
  55. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/config_test.py +0 -0
  56. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/containers.py +0 -0
  57. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/containers_test.py +0 -0
  58. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/create_project_templates/__init__.py +0 -0
  59. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
  60. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/dataset.py +0 -0
  61. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/developer.py +0 -0
  62. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/developer_test.py +0 -0
  63. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/doctor.py +0 -0
  64. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  65. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/doctor_templates/__init__.py +0 -0
  66. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/feeds.py +0 -0
  67. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/helper.py +0 -0
  68. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/helper_test.py +0 -0
  69. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/helpers.py +0 -0
  70. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/host.py +0 -0
  71. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/launch.py +0 -0
  72. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/llm.py +0 -0
  73. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/local_settings.py +0 -0
  74. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/local_settings_test.py +0 -0
  75. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/mailbot.py +0 -0
  76. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/mailbot_test.py +0 -0
  77. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/mailboxes.py +0 -0
  78. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/meeting_transcriber.py +0 -0
  79. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/memory.py +0 -0
  80. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/memory_test.py +0 -0
  81. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/meshagent_images.py +0 -0
  82. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/meshagent_images_test.py +0 -0
  83. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/messaging.py +0 -0
  84. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/multi.py +0 -0
  85. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/oauth2.py +0 -0
  86. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/oauth2_test.py +0 -0
  87. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/oci_archive.py +0 -0
  88. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/oci_archive_test.py +0 -0
  89. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/participant_token.py +0 -0
  90. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/port.py +0 -0
  91. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/port_test.py +0 -0
  92. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/preamble_rules.py +0 -0
  93. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/preamble_rules_test.py +0 -0
  94. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/process.py +0 -0
  95. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/process_live_test.py +0 -0
  96. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/process_test.py +0 -0
  97. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/projects.py +0 -0
  98. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/projects_test.py +0 -0
  99. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/queue.py +0 -0
  100. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/queue_test.py +0 -0
  101. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/registry.py +0 -0
  102. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/room.py +0 -0
  103. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/room_services.py +0 -0
  104. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/rooms.py +0 -0
  105. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/root_commands.py +0 -0
  106. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/root_commands_test.py +0 -0
  107. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/routes.py +0 -0
  108. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/scheduled_tasks.py +0 -0
  109. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/scheduled_tasks_test.py +0 -0
  110. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/services.py +0 -0
  111. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/sessions.py +0 -0
  112. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/sessions_test.py +0 -0
  113. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/storage.py +0 -0
  114. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/storage_test.py +0 -0
  115. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/subscriptions.py +0 -0
  116. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/sync.py +0 -0
  117. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/sync_test.py +0 -0
  118. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/task_runner.py +0 -0
  119. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/task_runner_test.py +0 -0
  120. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/test.py +0 -0
  121. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/thread_inspect.py +0 -0
  122. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/thread_inspect_test.py +0 -0
  123. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/thread_sidebar.py +0 -0
  124. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tool_call_summary.py +0 -0
  125. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tool_call_summary_test.py +0 -0
  126. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tool_integrations.py +0 -0
  127. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tool_integrations_test.py +0 -0
  128. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/__init__.py +0 -0
  129. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/auth_switch.py +0 -0
  130. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/auth_switch_test.py +0 -0
  131. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/deploy_room_test.py +0 -0
  132. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/project_activate.py +0 -0
  133. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/project_activate_test.py +0 -0
  134. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/setup.py +0 -0
  135. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  136. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/tui/setup_test.py +0 -0
  137. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/version_check.py +0 -0
  138. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/version_check_test.py +0 -0
  139. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/voicebot.py +0 -0
  140. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/webhook.py +0 -0
  141. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/webserver.py +0 -0
  142. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/webserver_test.py +0 -0
  143. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/worker.py +0 -0
  144. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent/cli/worker_test.py +0 -0
  145. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  146. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent_cli.egg-info/entry_points.txt +0 -0
  147. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/meshagent_cli.egg-info/top_level.txt +0 -0
  148. {meshagent_cli-0.44.10 → meshagent_cli-0.44.11}/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.11
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.11
26
+ Requires-Dist: meshagent-codex==0.44.11
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.11; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.44.11; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.44.11; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.44.11; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.44.11; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.44.11; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.44.11; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.44.11; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.44.11; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.44.11; 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.11; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.44.11; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.44.11; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.44.11; extra == "mcp-service"
52
52
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
53
53
  Dynamic: license-file
54
54
 
@@ -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
 
@@ -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
  ),