meshagent-cli 0.41.1__tar.gz → 0.41.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/PKG-INFO +16 -16
  2. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/ask.py +12 -11
  3. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/chatbot.py +0 -12
  4. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/create.py +173 -63
  5. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/create_test.py +295 -97
  6. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/image.py +3 -1
  7. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/image_test.py +12 -2
  8. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/local_settings.py +12 -0
  9. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/local_settings_test.py +14 -0
  10. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/process.py +15 -12
  11. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/process_test.py +107 -0
  12. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/rooms.py +50 -8
  13. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/rooms_test.py +75 -6
  14. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/create.py +4 -3
  15. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/deploy_room.py +92 -12
  16. meshagent_cli-0.41.2/meshagent/cli/tui/deploy_room_test.py +19 -0
  17. meshagent_cli-0.41.2/meshagent/cli/version.py +1 -0
  18. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent_cli.egg-info/PKG-INFO +16 -16
  19. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent_cli.egg-info/SOURCES.txt +1 -0
  20. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent_cli.egg-info/requires.txt +15 -15
  21. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/pyproject.toml +15 -15
  22. meshagent_cli-0.41.1/meshagent/cli/version.py +0 -1
  23. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/LICENSE +0 -0
  24. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/README.md +0 -0
  25. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/__init__.py +0 -0
  26. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/agent.py +0 -0
  27. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/agent_cli_options_test.py +0 -0
  28. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/agent_package_cli.py +0 -0
  29. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/agent_package_cli_test.py +0 -0
  30. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/agents.py +0 -0
  31. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/agents_test.py +0 -0
  32. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/api_keys.py +0 -0
  33. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/api_keys_test.py +0 -0
  34. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/ask_test.py +0 -0
  35. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/async_typer.py +0 -0
  36. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/async_typer_test.py +0 -0
  37. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/auth.py +0 -0
  38. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/auth_async.py +0 -0
  39. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/auth_async_test.py +0 -0
  40. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/auth_test.py +0 -0
  41. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/call.py +0 -0
  42. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/cli.py +0 -0
  43. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/cli_mcp.py +0 -0
  44. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/cli_secrets.py +0 -0
  45. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/cli_test.py +0 -0
  46. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/common_options.py +0 -0
  47. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/config.py +0 -0
  48. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/config_test.py +0 -0
  49. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/containers.py +0 -0
  50. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/containers_test.py +0 -0
  51. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/create_project_templates/__init__.py +0 -0
  52. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
  53. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
  54. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/dataset.py +0 -0
  55. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/dataset_test.py +0 -0
  56. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/developer.py +0 -0
  57. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/developer_test.py +0 -0
  58. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/doctor.py +0 -0
  59. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  60. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/doctor_templates/__init__.py +0 -0
  61. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/doctor_test.py +0 -0
  62. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/feeds.py +0 -0
  63. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/helper.py +0 -0
  64. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/helper_test.py +0 -0
  65. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/helpers.py +0 -0
  66. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/host.py +0 -0
  67. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/launch.py +0 -0
  68. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/launch_test.py +0 -0
  69. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/llm.py +0 -0
  70. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/llm_test.py +0 -0
  71. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/mailbot.py +0 -0
  72. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/mailbot_test.py +0 -0
  73. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/mailboxes.py +0 -0
  74. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/meeting_transcriber.py +0 -0
  75. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/memory.py +0 -0
  76. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/memory_test.py +0 -0
  77. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/meshagent_images.py +0 -0
  78. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/meshagent_images_test.py +0 -0
  79. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/messaging.py +0 -0
  80. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/multi.py +0 -0
  81. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/oauth2.py +0 -0
  82. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/oauth2_test.py +0 -0
  83. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/oci_archive.py +0 -0
  84. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/oci_archive_test.py +0 -0
  85. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/participant_token.py +0 -0
  86. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/port.py +0 -0
  87. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/port_test.py +0 -0
  88. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/preamble_rules.py +0 -0
  89. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/preamble_rules_test.py +0 -0
  90. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/process_live_test.py +0 -0
  91. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/projects.py +0 -0
  92. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/projects_test.py +0 -0
  93. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/queue.py +0 -0
  94. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/queue_test.py +0 -0
  95. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/registry.py +0 -0
  96. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/registry_test.py +0 -0
  97. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/room.py +0 -0
  98. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/room_connect.py +0 -0
  99. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/room_connect_test.py +0 -0
  100. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/room_services.py +0 -0
  101. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/root_commands.py +0 -0
  102. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/root_commands_test.py +0 -0
  103. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/routes.py +0 -0
  104. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/scheduled_tasks.py +0 -0
  105. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/scheduled_tasks_test.py +0 -0
  106. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/services.py +0 -0
  107. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/services_test.py +0 -0
  108. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/sessions.py +0 -0
  109. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/sessions_test.py +0 -0
  110. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/storage.py +0 -0
  111. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/storage_test.py +0 -0
  112. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/subscriptions.py +0 -0
  113. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/sync.py +0 -0
  114. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/sync_test.py +0 -0
  115. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/task_runner.py +0 -0
  116. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/task_runner_test.py +0 -0
  117. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/test.py +0 -0
  118. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tool_call_summary.py +0 -0
  119. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tool_call_summary_test.py +0 -0
  120. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tool_integrations.py +0 -0
  121. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tool_integrations_test.py +0 -0
  122. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/__init__.py +0 -0
  123. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/auth_switch.py +0 -0
  124. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/auth_switch_test.py +0 -0
  125. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/project_activate.py +0 -0
  126. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/project_activate_test.py +0 -0
  127. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/setup.py +0 -0
  128. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  129. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/tui/setup_test.py +0 -0
  130. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/voicebot.py +0 -0
  131. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/webhook.py +0 -0
  132. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/webserver.py +0 -0
  133. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/webserver_test.py +0 -0
  134. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/worker.py +0 -0
  135. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent/cli/worker_test.py +0 -0
  136. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  137. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent_cli.egg-info/entry_points.txt +0 -0
  138. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/meshagent_cli.egg-info/top_level.txt +0 -0
  139. {meshagent_cli-0.41.1 → meshagent_cli-0.41.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.41.1
3
+ Version: 0.41.2
4
4
  Summary: CLI for Meshagent
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Documentation, https://docs.meshagent.com
@@ -22,7 +22,7 @@ Requires-Dist: openpyxl~=3.1
22
22
  Requires-Dist: xlsxwriter~=3.2
23
23
  Requires-Dist: pathspec<2,>=1.0.3
24
24
  Requires-Dist: zstandard~=0.25.0
25
- Requires-Dist: meshagent-llm-proxy==0.41.1
25
+ Requires-Dist: meshagent-llm-proxy==0.41.2
26
26
  Requires-Dist: rich~=14.3.0
27
27
  Requires-Dist: sounddevice~=0.5
28
28
  Requires-Dist: textual<9.0,>=8.2.3
@@ -30,23 +30,23 @@ Requires-Dist: prompt-toolkit~=3.0.52
30
30
  Requires-Dist: ascii-magic~=2.3
31
31
  Requires-Dist: pillow~=11.3.0
32
32
  Provides-Extra: all
33
- Requires-Dist: meshagent-agents[all]==0.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"
33
+ Requires-Dist: meshagent-agents[all]==0.41.2; extra == "all"
34
+ Requires-Dist: meshagent-api[all]==0.41.2; extra == "all"
35
+ Requires-Dist: meshagent-commoncrawl==0.41.2; extra == "all"
36
+ Requires-Dist: meshagent-scrapy==0.41.2; extra == "all"
37
+ Requires-Dist: meshagent-computers==0.41.2; extra == "all"
38
+ Requires-Dist: meshagent-openai==0.41.2; extra == "all"
39
+ Requires-Dist: meshagent-anthropic==0.41.2; extra == "all"
40
+ Requires-Dist: meshagent-otel==0.41.2; extra == "all"
41
+ Requires-Dist: meshagent-mcp==0.41.2; extra == "all"
42
+ Requires-Dist: meshagent-tools==0.41.2; extra == "all"
43
43
  Requires-Dist: supabase-auth~=2.28.0; extra == "all"
44
44
  Requires-Dist: prompt-toolkit~=3.0.52; extra == "all"
45
45
  Provides-Extra: mcp-service
46
- Requires-Dist: meshagent-agents[all]==0.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"
46
+ Requires-Dist: meshagent-agents[all]==0.41.2; extra == "mcp-service"
47
+ Requires-Dist: meshagent-api==0.41.2; extra == "mcp-service"
48
+ Requires-Dist: meshagent-mcp==0.41.2; extra == "mcp-service"
49
+ Requires-Dist: meshagent-tools==0.41.2; extra == "mcp-service"
50
50
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
51
51
  Dynamic: license-file
52
52
 
@@ -2440,6 +2440,18 @@ async def _run_ask_tui(
2440
2440
  active_item_id = self._active_assistant_item_id
2441
2441
  await self._stop_active_assistant_stream()
2442
2442
  with self.batch_update():
2443
+ if active_text.strip() != "":
2444
+ changed = self._append_or_replace_feed_entry(
2445
+ _AskFeedEntry(
2446
+ role=active_name or "agent",
2447
+ text=active_text,
2448
+ message_id=active_item_id,
2449
+ ),
2450
+ )
2451
+ if changed:
2452
+ self._render_feed()
2453
+ if active_item_id is not None:
2454
+ self._rendered_session_message_ids.add(active_item_id)
2443
2455
  if self._active_assistant_event_break is not None:
2444
2456
  self._active_assistant_event_break.styles.display = "none"
2445
2457
  if self._active_assistant_entry_view is not None:
@@ -2449,17 +2461,6 @@ async def _run_ask_tui(
2449
2461
  self._active_assistant_header.update("")
2450
2462
  if self._active_assistant_body is not None:
2451
2463
  self._active_assistant_body.update("")
2452
- if active_text.strip() != "":
2453
- self._entries.append(
2454
- _AskFeedEntry(
2455
- role=active_name or "agent",
2456
- text=active_text,
2457
- message_id=active_item_id,
2458
- )
2459
- )
2460
- self._render_feed()
2461
- if active_item_id is not None:
2462
- self._rendered_session_message_ids.add(active_item_id)
2463
2464
  self._active_assistant_text = ""
2464
2465
  self._active_assistant_name = None
2465
2466
  self._active_assistant_item_id = None
@@ -2682,18 +2682,6 @@ def build_process_agent(
2682
2682
  combined_toolkits.extend(built_required_toolkits)
2683
2683
  combined_toolkits.extend(required_toolkits)
2684
2684
  combined_toolkits.extend(extra_toolkits)
2685
- if process.supervisor is not None:
2686
- for channel in process.supervisor.channels:
2687
- if channel.state != "started":
2688
- continue
2689
- turn_id = turns[-1].turn_id if len(turns) > 0 else None
2690
- if process.thread_id is not None:
2691
- combined_toolkits.extend(
2692
- channel.get_turn_toolkits(
2693
- thread_id=process.thread_id,
2694
- turn_id=turn_id,
2695
- )
2696
- )
2697
2685
  if process.thread_storage is not None:
2698
2686
  combined_toolkits.append(process.thread_storage.make_toolkit())
2699
2687
  return combined_toolkits
@@ -58,6 +58,7 @@ IGNORED_FILE_NAMES = {
58
58
  WEB_FOCUS = "webserver"
59
59
  AGENT_FOCUS = "backend-agent"
60
60
  CHATBOT_FOCUS = "chatbot"
61
+ ANTHROPIC_CHATBOT_FOCUS = "chatbot-anthropic"
61
62
  CHATBOT_UI_FOCUS = "chatbot-ui"
62
63
  DEFAULT_LANGUAGE = "python"
63
64
  DEFAULT_FOCUS = AGENT_FOCUS
@@ -96,101 +97,113 @@ class ExistingProjectSelection:
96
97
 
97
98
 
98
99
  WEBSERVER_NEXT_STEPS = (
99
- "meshagent doctor",
100
100
  "./scripts/install.sh",
101
- "MESHAGENT_ROOM=<room> ./scripts/dev.sh",
101
+ "./scripts/dev.sh",
102
102
  "./scripts/deploy.sh",
103
103
  )
104
104
  STATIC_WEBSERVER_NEXT_STEPS = (
105
- "meshagent doctor",
106
105
  "./scripts/install.sh",
107
- "MESHAGENT_ROOM=<room> ./scripts/dev.sh",
106
+ "./scripts/dev.sh",
108
107
  "./scripts/deploy.sh",
109
108
  )
110
109
  AGENT_NEXT_STEPS = (
111
- "meshagent doctor",
112
110
  "./scripts/install.sh",
113
- "MESHAGENT_ROOM=<room> ./scripts/dev.sh",
111
+ "./scripts/dev.sh",
114
112
  "./scripts/deploy.sh",
115
113
  )
116
114
  NPM_WEBSERVER_NEXT_STEPS = (
117
- "meshagent doctor",
118
115
  "npm install",
119
- "MESHAGENT_ROOM=<room> npm run dev",
116
+ "npm run dev",
120
117
  "npm run deploy",
121
118
  )
122
119
  NPM_STATIC_WEBSERVER_NEXT_STEPS = (
123
- "meshagent doctor",
124
120
  "npm install",
125
- "MESHAGENT_ROOM=<room> npm run dev",
121
+ "npm run dev",
126
122
  "npm run deploy",
127
123
  )
128
124
  NPM_CHATBOT_UI_NEXT_STEPS = (
129
- "meshagent doctor",
130
125
  "npm install",
131
- "MESHAGENT_ROOM=<room> npm run dev",
126
+ "npm run dev",
132
127
  "npm run deploy",
133
128
  )
134
129
  NPM_AGENT_NEXT_STEPS = (
135
- "meshagent doctor",
136
130
  "npm install",
137
- "MESHAGENT_ROOM=<room> npm run dev",
131
+ "npm run dev",
138
132
  "npm run deploy",
139
133
  )
134
+ AGENT_TOOLKIT_NAMES = {
135
+ "python": "meshagent.create.python-agent",
136
+ "javascript": "meshagent.create.javascript-agent",
137
+ "typescript": "meshagent.create.typescript-agent",
138
+ "dotnet": "meshagent.create.dotnet-agent",
139
+ "dart-flutter": "meshagent.create.dart-agent",
140
+ }
141
+ AGENT_PROCESS_NAMES = {
142
+ "python": "meshagent-create-python-agent",
143
+ "javascript": "meshagent-create-javascript-agent",
144
+ "typescript": "meshagent-create-typescript-agent",
145
+ "dotnet": "meshagent-create-dotnet-agent",
146
+ "dart-flutter": "meshagent-create-dart-agent",
147
+ }
140
148
 
141
149
  LANGUAGES: Mapping[str, CreateLanguage] = {
142
150
  "python": CreateLanguage(
143
151
  id="python",
144
152
  label="Python",
145
- description="Python 3.13.",
153
+ description="Python 3.13 services and agents.",
146
154
  ),
147
155
  "javascript": CreateLanguage(
148
156
  id="javascript",
149
157
  label="JavaScript",
150
- description="Node.js/CommonJS.",
158
+ description="Node.js CommonJS services and agents.",
151
159
  ),
152
160
  "typescript": CreateLanguage(
153
161
  id="typescript",
154
162
  label="TypeScript",
155
- description="Node.js/TypeScript.",
163
+ description="Node.js TypeScript services, agents, and chat apps.",
156
164
  ),
157
165
  "react": CreateLanguage(
158
166
  id="react",
159
167
  label="React",
160
- description="React/Vite.",
168
+ description="React/Vite browser app.",
161
169
  ),
162
170
  "dotnet": CreateLanguage(
163
171
  id="dotnet",
164
172
  label=".NET",
165
- description=".NET.",
173
+ description=".NET service or agent.",
166
174
  ),
167
175
  "dart-flutter": CreateLanguage(
168
176
  id="dart-flutter",
169
177
  label="Dart/Flutter",
170
- description="Dart or Flutter.",
178
+ description="Flutter Web App or Dart Agent Toolkit.",
171
179
  ),
172
180
  }
173
181
 
174
182
  FOCUSES: Mapping[str, CreateFocus] = {
175
183
  WEB_FOCUS: CreateFocus(
176
184
  id=WEB_FOCUS,
177
- label="Web server",
178
- description="HTTP app with a health endpoint and public route.",
185
+ label="Web App",
186
+ description="Public HTTP service with a health endpoint.",
179
187
  ),
180
188
  AGENT_FOCUS: CreateFocus(
181
189
  id=AGENT_FOCUS,
182
- label="Backend agent",
183
- description="Headless RoomClient SDK service without a public port.",
190
+ label="Agent Toolkit",
191
+ description="Expose custom functionality to agents in the room.",
184
192
  ),
185
193
  CHATBOT_FOCUS: CreateFocus(
186
194
  id=CHATBOT_FOCUS,
187
- label="Chatbot",
188
- description="TypeScript RoomClient chatbot with one chat tool.",
195
+ label="OpenAI Chatbot",
196
+ description="Browser chat app backed by the room OpenAI proxy.",
197
+ ),
198
+ ANTHROPIC_CHATBOT_FOCUS: CreateFocus(
199
+ id=ANTHROPIC_CHATBOT_FOCUS,
200
+ label="Anthropic Chatbot",
201
+ description="Browser chat app backed by the room Anthropic proxy.",
189
202
  ),
190
203
  CHATBOT_UI_FOCUS: CreateFocus(
191
204
  id=CHATBOT_UI_FOCUS,
192
- label="Chatbot UI",
193
- description="TypeScript/Next.js UI that chats with a MeshAgent assistant.",
205
+ label="Agent UI",
206
+ description="Browser chat interface for a deployed MeshAgent agent.",
194
207
  ),
195
208
  }
196
209
 
@@ -209,8 +222,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
209
222
  ("python", WEB_FOCUS): CreateTemplate(
210
223
  language_id="python",
211
224
  focus_id=WEB_FOCUS,
212
- label="Python web server",
213
- description="Async Python HTTP service on a declared container port.",
225
+ label="Python Web App",
226
+ description="Async Python public HTTP service with a health route.",
214
227
  files=_template_files(
215
228
  "python",
216
229
  WEB_FOCUS,
@@ -230,8 +243,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
230
243
  ("python", AGENT_FOCUS): CreateTemplate(
231
244
  language_id="python",
232
245
  focus_id=AGENT_FOCUS,
233
- label="Python backend agent",
234
- description="Headless Python RoomClient service.",
246
+ label="Python Agent Toolkit",
247
+ description="Headless Python service that exposes custom tools to agents.",
235
248
  files=_template_files(
236
249
  "python",
237
250
  AGENT_FOCUS,
@@ -250,8 +263,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
250
263
  ("javascript", WEB_FOCUS): CreateTemplate(
251
264
  language_id="javascript",
252
265
  focus_id=WEB_FOCUS,
253
- label="JavaScript web server",
254
- description="Node.js HTTP service on a declared container port.",
266
+ label="JavaScript Web App",
267
+ description="Node.js public HTTP service with a health route.",
255
268
  files=_template_files(
256
269
  "javascript",
257
270
  WEB_FOCUS,
@@ -269,8 +282,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
269
282
  ("javascript", AGENT_FOCUS): CreateTemplate(
270
283
  language_id="javascript",
271
284
  focus_id=AGENT_FOCUS,
272
- label="JavaScript backend agent",
273
- description="Headless Node.js RoomClient service.",
285
+ label="JavaScript Agent Toolkit",
286
+ description="Headless Node.js service that exposes custom tools to agents.",
274
287
  files=_template_files(
275
288
  "javascript",
276
289
  AGENT_FOCUS,
@@ -287,8 +300,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
287
300
  ("typescript", WEB_FOCUS): CreateTemplate(
288
301
  language_id="typescript",
289
302
  focus_id=WEB_FOCUS,
290
- label="TypeScript web server",
291
- description="Node.js TypeScript HTTP service on a declared container port.",
303
+ label="TypeScript Web App",
304
+ description="TypeScript public HTTP service with a health route.",
292
305
  files=_template_files(
293
306
  "typescript",
294
307
  WEB_FOCUS,
@@ -307,8 +320,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
307
320
  ("typescript", AGENT_FOCUS): CreateTemplate(
308
321
  language_id="typescript",
309
322
  focus_id=AGENT_FOCUS,
310
- label="TypeScript backend agent",
311
- description="Headless TypeScript RoomClient service.",
323
+ label="TypeScript Agent Toolkit",
324
+ description="Headless TypeScript service that exposes custom tools to agents.",
312
325
  files=_template_files(
313
326
  "typescript",
314
327
  AGENT_FOCUS,
@@ -326,23 +339,38 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
326
339
  ("typescript", CHATBOT_FOCUS): CreateTemplate(
327
340
  language_id="typescript",
328
341
  focus_id=CHATBOT_FOCUS,
329
- label="TypeScript chatbot",
330
- description="Headless TypeScript RoomClient chatbot.",
342
+ label="TypeScript OpenAI Chatbot",
343
+ description="Browser chatbot backed by the room OpenAI proxy.",
331
344
  files={
332
345
  "package.json": "typescript/chatbot/package.json",
333
346
  ".npmrc": "typescript/backend-agent/.npmrc",
334
347
  "tsconfig.json": "typescript/backend-agent/tsconfig.json",
335
348
  "src/server.ts": "typescript/chatbot/src/server.ts",
336
- "Dockerfile": "typescript/backend-agent/Dockerfile",
349
+ "Dockerfile": "typescript/webserver/Dockerfile",
337
350
  ".dockerignore": "typescript/backend-agent/.dockerignore",
338
351
  },
339
- next_steps=NPM_AGENT_NEXT_STEPS,
352
+ next_steps=NPM_WEBSERVER_NEXT_STEPS,
353
+ ),
354
+ ("typescript", ANTHROPIC_CHATBOT_FOCUS): CreateTemplate(
355
+ language_id="typescript",
356
+ focus_id=ANTHROPIC_CHATBOT_FOCUS,
357
+ label="TypeScript Anthropic Chatbot",
358
+ description="Browser chatbot backed by the room Anthropic proxy.",
359
+ files={
360
+ "package.json": "typescript/chatbot-anthropic/package.json",
361
+ ".npmrc": "typescript/backend-agent/.npmrc",
362
+ "tsconfig.json": "typescript/backend-agent/tsconfig.json",
363
+ "src/server.ts": "typescript/chatbot-anthropic/src/server.ts",
364
+ "Dockerfile": "typescript/webserver/Dockerfile",
365
+ ".dockerignore": "typescript/backend-agent/.dockerignore",
366
+ },
367
+ next_steps=NPM_WEBSERVER_NEXT_STEPS,
340
368
  ),
341
369
  ("react", WEB_FOCUS): CreateTemplate(
342
370
  language_id="react",
343
371
  focus_id=WEB_FOCUS,
344
- label="React web server",
345
- description="React/Vite web app served by nginx on a declared container port.",
372
+ label="React/Vite Web App",
373
+ description="React/Vite browser app served as a public route.",
346
374
  files=_template_files(
347
375
  "react",
348
376
  WEB_FOCUS,
@@ -364,8 +392,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
364
392
  ("typescript", CHATBOT_UI_FOCUS): CreateTemplate(
365
393
  language_id="typescript",
366
394
  focus_id=CHATBOT_UI_FOCUS,
367
- label="TypeScript chatbot UI",
368
- description="TypeScript/Next.js UI that chats with a MeshAgent assistant.",
395
+ label="TypeScript Agent UI",
396
+ description="Browser chat interface for a deployed MeshAgent agent.",
369
397
  files=_template_files(
370
398
  "typescript",
371
399
  CHATBOT_UI_FOCUS,
@@ -388,8 +416,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
388
416
  ("dotnet", WEB_FOCUS): CreateTemplate(
389
417
  language_id="dotnet",
390
418
  focus_id=WEB_FOCUS,
391
- label=".NET web server",
392
- description="ASP.NET Core HTTP service on a declared container port.",
419
+ label=".NET Web App",
420
+ description="ASP.NET Core public HTTP service with a health route.",
393
421
  files=_template_files(
394
422
  "dotnet",
395
423
  WEB_FOCUS,
@@ -408,8 +436,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
408
436
  ("dotnet", AGENT_FOCUS): CreateTemplate(
409
437
  language_id="dotnet",
410
438
  focus_id=AGENT_FOCUS,
411
- label=".NET backend agent",
412
- description="Headless .NET RoomClient service.",
439
+ label=".NET Agent Toolkit",
440
+ description="Headless .NET service that exposes custom tools to agents.",
413
441
  files=_template_files(
414
442
  "dotnet",
415
443
  AGENT_FOCUS,
@@ -428,8 +456,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
428
456
  ("dart-flutter", WEB_FOCUS): CreateTemplate(
429
457
  language_id="dart-flutter",
430
458
  focus_id=WEB_FOCUS,
431
- label="Flutter web server",
432
- description="Flutter web app served by nginx on a declared container port.",
459
+ label="Flutter Web App",
460
+ description="Flutter browser app served as a public route.",
433
461
  files=_template_files(
434
462
  "dart-flutter",
435
463
  WEB_FOCUS,
@@ -450,8 +478,8 @@ TEMPLATES: Mapping[tuple[str, str], CreateTemplate] = {
450
478
  ("dart-flutter", AGENT_FOCUS): CreateTemplate(
451
479
  language_id="dart-flutter",
452
480
  focus_id=AGENT_FOCUS,
453
- label="Dart backend agent",
454
- description="Headless Dart RoomClient service.",
481
+ label="Dart Agent Toolkit",
482
+ description="Headless Dart service that exposes custom tools to agents.",
455
483
  files=_template_files(
456
484
  "dart-flutter",
457
485
  AGENT_FOCUS,
@@ -500,8 +528,20 @@ FOCUS_ALIASES = {
500
528
  "backend": AGENT_FOCUS,
501
529
  "backend-agent": AGENT_FOCUS,
502
530
  "backend_agent": AGENT_FOCUS,
531
+ "agent-toolkit": AGENT_FOCUS,
532
+ "agent_toolkit": AGENT_FOCUS,
533
+ "room-agent": AGENT_FOCUS,
534
+ "room_agent": AGENT_FOCUS,
535
+ "anthropic-chat": ANTHROPIC_CHATBOT_FOCUS,
536
+ "anthropic-chatbot": ANTHROPIC_CHATBOT_FOCUS,
503
537
  "chat": CHATBOT_FOCUS,
504
538
  "chatbot": CHATBOT_FOCUS,
539
+ "openai-chat": CHATBOT_FOCUS,
540
+ "openai-chatbot": CHATBOT_FOCUS,
541
+ "chatbot-anthropic": ANTHROPIC_CHATBOT_FOCUS,
542
+ "chatbot_anthropic": ANTHROPIC_CHATBOT_FOCUS,
543
+ "agent-ui": CHATBOT_UI_FOCUS,
544
+ "agent_ui": CHATBOT_UI_FOCUS,
505
545
  "chat-ui": CHATBOT_UI_FOCUS,
506
546
  "chat_ui": CHATBOT_UI_FOCUS,
507
547
  "chatbot-ui": CHATBOT_UI_FOCUS,
@@ -509,6 +549,8 @@ FOCUS_ALIASES = {
509
549
  "roomclient": AGENT_FOCUS,
510
550
  "room-client": AGENT_FOCUS,
511
551
  "web": WEB_FOCUS,
552
+ "web-app": WEB_FOCUS,
553
+ "web_app": WEB_FOCUS,
512
554
  "webserver": WEB_FOCUS,
513
555
  "web-server": WEB_FOCUS,
514
556
  "web_server": WEB_FOCUS,
@@ -737,6 +779,76 @@ def _write_template(root: Path, template: CreateTemplate) -> None:
737
779
  _write_file(root / name, template_name)
738
780
 
739
781
 
782
+ def _next_step_sections(
783
+ steps: tuple[str, ...],
784
+ ) -> tuple[tuple[str, tuple[str, ...]], ...]:
785
+ section_specs = (
786
+ ("Install dependencies", ("install",)),
787
+ ("Run locally", ("dev",)),
788
+ ("Deploy", ("deploy",)),
789
+ )
790
+ sections: list[tuple[str, tuple[str, ...]]] = []
791
+ matched_steps: set[str] = set()
792
+ for title, keywords in section_specs:
793
+ section_steps = tuple(
794
+ step for step in steps if any(keyword in step for keyword in keywords)
795
+ )
796
+ if section_steps:
797
+ sections.append((title, section_steps))
798
+ matched_steps.update(section_steps)
799
+
800
+ other_steps = tuple(step for step in steps if step not in matched_steps)
801
+ if other_steps:
802
+ sections.append(("Other", other_steps))
803
+ return tuple(sections)
804
+
805
+
806
+ def _print_next_steps(
807
+ steps: tuple[str, ...],
808
+ *,
809
+ enter_project_root: Path | None = None,
810
+ ) -> None:
811
+ click.secho("Next steps:", fg="cyan", bold=True)
812
+ if enter_project_root is not None:
813
+ click.secho(f" cd {shlex.quote(str(enter_project_root))}", fg="green")
814
+ for index, (title, section_steps) in enumerate(_next_step_sections(steps), start=1):
815
+ if index > 1:
816
+ click.echo("")
817
+ click.secho(f" {index}. {title}", fg="blue", bold=True)
818
+ for step in section_steps:
819
+ click.secho(f" {step}", fg="green")
820
+
821
+
822
+ def _paired_agent_deploy_command(template: CreateTemplate) -> str | None:
823
+ if template.focus_id != AGENT_FOCUS:
824
+ return None
825
+ toolkit_name = AGENT_TOOLKIT_NAMES.get(template.language_id)
826
+ agent_name = AGENT_PROCESS_NAMES.get(template.language_id)
827
+ if toolkit_name is None or agent_name is None:
828
+ return None
829
+ rule = f"Use the {toolkit_name} toolkit to answer ping, status, and echo requests."
830
+ return (
831
+ "meshagent process deploy "
832
+ "--room <room> "
833
+ f"--agent-name {agent_name} "
834
+ f"--require-toolkit {toolkit_name} "
835
+ f"--rule {shlex.quote(rule)}"
836
+ )
837
+
838
+
839
+ def _print_agent_toolkit_guidance(template: CreateTemplate) -> None:
840
+ command = _paired_agent_deploy_command(template)
841
+ if command is None:
842
+ return
843
+ click.echo("")
844
+ click.secho(
845
+ "To install an agent in your room that uses this tool run:",
846
+ fg="cyan",
847
+ bold=True,
848
+ )
849
+ click.secho(f" {command}", fg="green")
850
+
851
+
740
852
  def _print_created_report(
741
853
  *,
742
854
  template: CreateTemplate,
@@ -747,11 +859,8 @@ def _print_created_report(
747
859
  for name in template.files:
748
860
  click.echo(f" {name}")
749
861
  click.echo("")
750
- click.echo("Next steps:")
751
- if enter_project_root is not None:
752
- click.echo(f" cd {shlex.quote(str(enter_project_root))}")
753
- for step in template.next_steps:
754
- click.echo(f" {step}")
862
+ _print_next_steps(template.next_steps, enter_project_root=enter_project_root)
863
+ _print_agent_toolkit_guidance(template)
755
864
 
756
865
 
757
866
  @click.command(
@@ -773,8 +882,9 @@ def _print_created_report(
773
882
  type=str,
774
883
  default=None,
775
884
  help=(
776
- "Project focus for non-interactive use. Supported: webserver, backend-agent."
777
- " TypeScript also supports chatbot and chatbot-ui."
885
+ "Project focus for non-interactive use. Use stable IDs: webserver "
886
+ "(Web App), backend-agent (Agent Toolkit), chatbot (OpenAI Chatbot), "
887
+ "chatbot-anthropic (Anthropic Chatbot), or chatbot-ui (Agent UI)."
778
888
  ),
779
889
  )
780
890
  @click.option(