meshagent-cli 0.46.4__tar.gz → 0.47.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/PKG-INFO +17 -17
  2. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/agent_package_cli.py +2 -34
  3. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/agent_package_cli_test.py +4 -4
  4. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/agents.py +41 -3
  5. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/agents_test.py +86 -7
  6. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/ask.py +21 -1
  7. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/ask_test.py +116 -0
  8. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/cli.py +8 -1
  9. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/cli_test.py +12 -0
  10. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/create.py +155 -61
  11. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/slack-channel/channel.py +1517 -0
  12. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/slack-channel/scripts/configure-slack.py +563 -0
  13. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/slack-channel/scripts/setup-slack-dev-route.py +659 -0
  14. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/slack-channel/server.py +119 -0
  15. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/telegram-channel/channel.py +1845 -0
  16. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/telegram-channel/scripts/configure-telegram.py +597 -0
  17. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/telegram-channel/scripts/create-bot-token.py +316 -0
  18. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/telegram-channel/server.py +88 -0
  19. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/twilio-channel/channel.py +1411 -0
  20. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/twilio-channel/server.py +118 -0
  21. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/whatsapp-channel/channel.py +2700 -0
  22. meshagent_cli-0.47.1/meshagent/cli/create_project_templates/python/whatsapp-channel/server.py +104 -0
  23. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/create_test.py +1640 -6
  24. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/feeds.py +29 -1
  25. meshagent_cli-0.47.1/meshagent/cli/feeds_test.py +158 -0
  26. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/helper.py +2 -2
  27. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/helper_test.py +5 -0
  28. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/image.py +166 -38
  29. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/image_test.py +262 -4
  30. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/llm_test.py +31 -0
  31. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/mailboxes.py +37 -5
  32. meshagent_cli-0.47.1/meshagent/cli/mailboxes_test.py +152 -0
  33. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/process.py +127 -27
  34. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/process_test.py +200 -76
  35. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/room_connect.py +15 -7
  36. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/room_connect_test.py +65 -30
  37. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/rooms.py +15 -4
  38. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/rooms_test.py +67 -2
  39. meshagent_cli-0.47.1/meshagent/cli/sample_channel_http_test.py +352 -0
  40. meshagent_cli-0.47.1/meshagent/cli/sample_channel_live_e2e_test.py +96 -0
  41. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/scheduled_tasks.py +64 -11
  42. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/scheduled_tasks_test.py +126 -10
  43. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/thread_inspect.py +93 -1
  44. meshagent_cli-0.47.1/meshagent/cli/thread_inspect_test.py +248 -0
  45. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tool_call_summary.py +70 -0
  46. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tool_call_summary_test.py +34 -0
  47. meshagent_cli-0.47.1/meshagent/cli/version.py +1 -0
  48. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent_cli.egg-info/PKG-INFO +17 -17
  49. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent_cli.egg-info/SOURCES.txt +15 -0
  50. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent_cli.egg-info/requires.txt +16 -16
  51. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/pyproject.toml +16 -16
  52. meshagent_cli-0.46.4/meshagent/cli/mailboxes_test.py +0 -43
  53. meshagent_cli-0.46.4/meshagent/cli/thread_inspect_test.py +0 -66
  54. meshagent_cli-0.46.4/meshagent/cli/version.py +0 -1
  55. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/LICENSE +0 -0
  56. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/README.md +0 -0
  57. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/__init__.py +0 -0
  58. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/_filedrop.py +0 -0
  59. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/agent.py +0 -0
  60. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/agent_cli_options_test.py +0 -0
  61. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/async_typer.py +0 -0
  62. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/async_typer_test.py +0 -0
  63. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/auth.py +0 -0
  64. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/auth_async.py +0 -0
  65. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/auth_async_test.py +0 -0
  66. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/auth_test.py +0 -0
  67. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/call.py +0 -0
  68. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/chatbot.py +0 -0
  69. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/cli_mcp.py +0 -0
  70. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/common_options.py +0 -0
  71. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/config.py +0 -0
  72. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/config_test.py +0 -0
  73. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/containers.py +0 -0
  74. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/containers_test.py +0 -0
  75. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/create_project_templates/__init__.py +0 -0
  76. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
  77. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
  78. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
  79. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
  80. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/dataset.py +0 -0
  81. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/dataset_test.py +0 -0
  82. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/developer.py +0 -0
  83. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/developer_test.py +0 -0
  84. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/doctor.py +0 -0
  85. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  86. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/doctor_templates/__init__.py +0 -0
  87. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/doctor_test.py +0 -0
  88. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/helpers.py +0 -0
  89. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/host.py +0 -0
  90. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/iam.py +0 -0
  91. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/iam_test.py +0 -0
  92. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/launch.py +0 -0
  93. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/launch_test.py +0 -0
  94. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/llm.py +0 -0
  95. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/local_settings.py +0 -0
  96. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/local_settings_test.py +0 -0
  97. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/mailbot.py +0 -0
  98. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/mailbot_test.py +0 -0
  99. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/meeting_transcriber.py +0 -0
  100. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/memory.py +0 -0
  101. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/memory_test.py +0 -0
  102. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/meshagent_images.py +0 -0
  103. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/meshagent_images_test.py +0 -0
  104. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/messaging.py +0 -0
  105. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/messaging_test.py +0 -0
  106. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/multi.py +0 -0
  107. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/oci_archive.py +0 -0
  108. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/oci_archive_test.py +0 -0
  109. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/participant_token.py +0 -0
  110. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/port.py +0 -0
  111. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/port_test.py +0 -0
  112. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/preamble_rules.py +0 -0
  113. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/preamble_rules_test.py +0 -0
  114. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/process_live_test.py +0 -0
  115. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/projects.py +0 -0
  116. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/projects_test.py +0 -0
  117. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/queue.py +0 -0
  118. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/queue_test.py +0 -0
  119. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/registry.py +0 -0
  120. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/registry_test.py +0 -0
  121. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/room.py +0 -0
  122. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/room_services.py +0 -0
  123. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/room_services_test.py +0 -0
  124. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/root_commands.py +0 -0
  125. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/root_commands_test.py +0 -0
  126. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/routes.py +0 -0
  127. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/routes_test.py +0 -0
  128. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/secrets.py +0 -0
  129. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/secrets_test.py +0 -0
  130. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/service_accounts.py +0 -0
  131. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/service_accounts_test.py +0 -0
  132. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/services.py +0 -0
  133. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/services_test.py +0 -0
  134. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/sessions.py +0 -0
  135. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/sessions_test.py +0 -0
  136. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/sqlite.py +0 -0
  137. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/sqlite_test.py +0 -0
  138. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/storage.py +0 -0
  139. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/storage_test.py +0 -0
  140. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/subscriptions.py +0 -0
  141. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/sync.py +0 -0
  142. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/sync_test.py +0 -0
  143. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/task_runner.py +0 -0
  144. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/task_runner_test.py +0 -0
  145. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/test.py +0 -0
  146. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/testing.py +0 -0
  147. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/thread_sidebar.py +0 -0
  148. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tool_integrations.py +0 -0
  149. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tool_integrations_test.py +0 -0
  150. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/__init__.py +0 -0
  151. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/auth_switch.py +0 -0
  152. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/auth_switch_test.py +0 -0
  153. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/create.py +0 -0
  154. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/deploy_room.py +0 -0
  155. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/deploy_room_test.py +0 -0
  156. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/project_activate.py +0 -0
  157. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/project_activate_test.py +0 -0
  158. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/setup.py +0 -0
  159. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  160. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/tui/setup_test.py +0 -0
  161. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/version_check.py +0 -0
  162. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/version_check_test.py +0 -0
  163. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/voicebot.py +0 -0
  164. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/webserver.py +0 -0
  165. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/webserver_test.py +0 -0
  166. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/worker.py +0 -0
  167. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent/cli/worker_test.py +0 -0
  168. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  169. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent_cli.egg-info/entry_points.txt +0 -0
  170. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/meshagent_cli.egg-info/top_level.txt +0 -0
  171. {meshagent_cli-0.46.4 → meshagent_cli-0.47.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.46.4
3
+ Version: 0.47.1
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.46.4
26
- Requires-Dist: meshagent-codex==0.46.4
25
+ Requires-Dist: meshagent-llm-proxy==0.47.1
26
+ Requires-Dist: meshagent-codex==0.47.1
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.46.4; extra == "all"
36
- Requires-Dist: meshagent-api[all]==0.46.4; extra == "all"
37
- Requires-Dist: meshagent-commoncrawl==0.46.4; extra == "all"
38
- Requires-Dist: meshagent-scrapy==0.46.4; extra == "all"
39
- Requires-Dist: meshagent-computers==0.46.4; extra == "all"
40
- Requires-Dist: meshagent-openai==0.46.4; extra == "all"
41
- Requires-Dist: meshagent-anthropic==0.46.4; extra == "all"
42
- Requires-Dist: meshagent-otel==0.46.4; extra == "all"
43
- Requires-Dist: meshagent-mcp==0.46.4; extra == "all"
44
- Requires-Dist: meshagent-tools==0.46.4; extra == "all"
35
+ Requires-Dist: meshagent-agents[all]==0.47.1; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.47.1; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.47.1; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.47.1; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.47.1; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.47.1; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.47.1; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.47.1; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.47.1; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.47.1; 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.46.4; extra == "mcp-service"
49
- Requires-Dist: meshagent-api==0.46.4; extra == "mcp-service"
50
- Requires-Dist: meshagent-mcp==0.46.4; extra == "mcp-service"
51
- Requires-Dist: meshagent-tools==0.46.4; extra == "mcp-service"
48
+ Requires-Dist: meshagent-agents[all]==0.47.1; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.47.1; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.47.1; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.47.1; extra == "mcp-service"
52
52
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
53
53
  Dynamic: license-file
54
54
 
@@ -9,51 +9,19 @@ from rich.text import Text
9
9
  from typing import Annotated
10
10
 
11
11
  from meshagent.agents import Package, deploy_package, run_package
12
- import meshagent.agents.package as package_module
12
+ from meshagent.agents.package import load_package
13
13
  from meshagent.api import RoomClient, WebSocketClientProtocol
14
14
  from meshagent.cli import async_typer
15
15
  from meshagent.cli.common_options import ProjectIdOption, RoomOption
16
16
  from meshagent.cli.containers import _stream_container_job_logs_and_wait_for_exit
17
17
  from meshagent.cli.helper import get_client, resolve_project_id, resolve_room
18
- from meshagent.cli.multi import import_from_path
19
18
 
20
19
 
21
20
  app = async_typer.AsyncTyper(help="Build, run, and deploy packaged services.")
22
21
 
23
22
 
24
23
  def _load_package(*, module_path: str, export_name: str) -> Package:
25
- resolved_module_path = Path(module_path).expanduser().resolve()
26
- with package_module._agent_base_path_scope(resolved_module_path.parent):
27
- module = import_from_path(str(resolved_module_path))
28
-
29
- if export_name not in module.__dict__:
30
- raise ImportError(f"{resolved_module_path} does not define {export_name}")
31
-
32
- exported = module.__dict__[export_name]
33
- if isinstance(exported, Package):
34
- exported._bind_module_path(module_path=resolved_module_path)
35
- exported._bind_module_export(
36
- export_name=export_name,
37
- export_is_factory=False,
38
- )
39
- return exported
40
-
41
- if callable(exported):
42
- built = exported()
43
- if isinstance(built, Package):
44
- built._bind_module_path(module_path=resolved_module_path)
45
- built._bind_module_export(
46
- export_name=export_name,
47
- export_is_factory=True,
48
- )
49
- return built
50
- raise TypeError(
51
- f"{resolved_module_path}:{export_name} returned {type(built).__name__}, expected meshagent.agents.Package"
52
- )
53
-
54
- raise TypeError(
55
- f"{resolved_module_path}:{export_name} is {type(exported).__name__}, expected meshagent.agents.Package or a zero-argument callable returning one"
56
- )
24
+ return load_package(module_path=module_path, export_name=export_name)
57
25
 
58
26
 
59
27
  def _print_packaged_files(*, package: Package) -> None:
@@ -184,8 +184,8 @@ async def test_package_run_command_invokes_package_run_and_tails_logs(
184
184
  captured["delete"] = container_id
185
185
 
186
186
  class _FakeRoomClient:
187
- def __init__(self, *, protocol) -> None:
188
- del protocol
187
+ def __init__(self, *, protocol_factory) -> None:
188
+ del protocol_factory
189
189
  self.containers = _FakeContainers()
190
190
 
191
191
  async def __aenter__(self):
@@ -293,8 +293,8 @@ async def test_package_run_command_deletes_container_on_interrupt(
293
293
  captured["delete"] = container_id
294
294
 
295
295
  class _FakeRoomClient:
296
- def __init__(self, *, protocol) -> None:
297
- del protocol
296
+ def __init__(self, *, protocol_factory) -> None:
297
+ del protocol_factory
298
298
  self.containers = _FakeContainers()
299
299
 
300
300
  async def __aenter__(self):
@@ -6,6 +6,7 @@ import typer
6
6
  from rich import print
7
7
 
8
8
  from meshagent.api import RoomException
9
+ from meshagent.api.client import ManagedAgent
9
10
  from meshagent.api.managed_agents import ManagedAgentSpec
10
11
  from meshagent.agents.chat_client import ChatThreadSession, WebSocketChatClient
11
12
  from meshagent.agents.messages import (
@@ -24,6 +25,35 @@ app = async_typer.AsyncTyper(
24
25
  )
25
26
 
26
27
 
28
+ async def _list_agents(
29
+ account_client,
30
+ *,
31
+ project_id: str,
32
+ count: int,
33
+ offset: int,
34
+ filter: str | None,
35
+ ) -> list[ManagedAgent]:
36
+ agents: list[ManagedAgent] = []
37
+ continuation_token: str | None = None
38
+ # The "my" view is paged in access-object order, so exhaust it before applying
39
+ # the CLI's global name ordering and offset.
40
+ while True:
41
+ page = await account_client.list_agents_page(
42
+ project_id=project_id,
43
+ page_size=100,
44
+ continuation_token=continuation_token,
45
+ filter=filter,
46
+ view="my",
47
+ )
48
+ agents.extend(page.agents)
49
+ continuation_token = page.continuation_token
50
+ if continuation_token is None or not page.agents:
51
+ break
52
+
53
+ agents.sort(key=lambda agent: agent.name.lower())
54
+ return agents[offset : offset + count]
55
+
56
+
27
57
  def _maybe_parse_json_object(label: str, value: Optional[str]) -> Optional[dict]:
28
58
  if value is None:
29
59
  return None
@@ -597,19 +627,27 @@ async def agent_list_command(
597
627
  ] = None,
598
628
  offset: Annotated[int, typer.Option(help="Offset for pagination", min=0)] = 0,
599
629
  order_by: Annotated[
600
- str, typer.Option(help='Order by column (e.g. "agent_name", "created_at")')
630
+ str, typer.Option(help='Order agents by name; only "agent_name" is supported')
601
631
  ] = "agent_name",
602
632
  filter: Annotated[
603
633
  Optional[str],
604
634
  typer.Option("--filter", help="Lowercase contains filter for agent names"),
605
635
  ] = None,
606
636
  ):
637
+ if order_by != "agent_name":
638
+ raise typer.BadParameter(
639
+ 'Only "agent_name" is supported.', param_hint="--order-by"
640
+ )
641
+
607
642
  account_client = await get_client()
608
643
  try:
609
644
  project_id = await resolve_project_id(project_id=project_id)
610
- agents = await account_client.list_agents(
645
+ agent_count = limit if limit is not None else count
646
+ agents = await _list_agents(
647
+ account_client,
611
648
  project_id=project_id,
612
- page_size=limit if limit is not None else count,
649
+ count=agent_count,
650
+ offset=offset,
613
651
  filter=filter,
614
652
  )
615
653
  output = [
@@ -1,6 +1,7 @@
1
1
  import json
2
2
 
3
3
  import pytest
4
+ import typer
4
5
 
5
6
  from meshagent.agents.chat_client import BaseChatClient, ChatThreadSession
6
7
  from meshagent.agents.messages import (
@@ -10,7 +11,7 @@ from meshagent.agents.messages import (
10
11
  AgentTextContent,
11
12
  StartThread,
12
13
  )
13
- from meshagent.api.client import ManagedAgent
14
+ from meshagent.api.client import AgentsPage, ManagedAgent
14
15
  from meshagent.api.managed_agents import (
15
16
  AllowedOpenAIModel,
16
17
  ManagedAgentMetadata,
@@ -25,6 +26,7 @@ class _FakeAgentClient:
25
26
  self.create_agent_calls: list[dict[str, object]] = []
26
27
  self.update_agent_calls: list[dict[str, object]] = []
27
28
  self.list_agents_calls: list[dict[str, object]] = []
29
+ self.list_agents_page_results: list[AgentsPage] = []
28
30
  self.get_agent_calls: list[dict[str, object]] = []
29
31
  self.list_agents_result: list[ManagedAgent] = []
30
32
  self.get_agent_result: ManagedAgent | None = None
@@ -60,21 +62,27 @@ class _FakeAgentClient:
60
62
  }
61
63
  )
62
64
 
63
- async def list_agents(
65
+ async def list_agents_page(
64
66
  self,
65
67
  *,
66
68
  project_id: str,
67
69
  page_size: int,
70
+ continuation_token: str | None = None,
68
71
  filter: str | None = None,
69
- ) -> list[ManagedAgent]:
72
+ view: str | None = None,
73
+ ) -> AgentsPage:
70
74
  self.list_agents_calls.append(
71
75
  {
72
76
  "project_id": project_id,
73
77
  "page_size": page_size,
78
+ "continuation_token": continuation_token,
74
79
  "filter": filter,
80
+ "view": view,
75
81
  }
76
82
  )
77
- return self.list_agents_result
83
+ if self.list_agents_page_results:
84
+ return self.list_agents_page_results.pop(0)
85
+ return AgentsPage(agents=self.list_agents_result, continuation_token=None)
78
86
 
79
87
  async def get_agent(self, *, project_id: str, name: str) -> ManagedAgent:
80
88
  self.get_agent_calls.append({"project_id": project_id, "name": name})
@@ -112,10 +120,12 @@ class _FakeWebSocketChatClient(BaseChatClient):
112
120
  )
113
121
 
114
122
 
115
- def _sample_configuration(*, agent_id: str | None = "agent-1") -> ManagedAgentSpec:
123
+ def _sample_configuration(
124
+ *, agent_id: str | None = "agent-1", name: str = "planner"
125
+ ) -> ManagedAgentSpec:
116
126
  return ManagedAgentSpec(
117
127
  id=agent_id,
118
- metadata=ManagedAgentMetadata(name="planner"),
128
+ metadata=ManagedAgentMetadata(name=name),
119
129
  allowed_models=[AllowedOpenAIModel(model="gpt-4.1")],
120
130
  )
121
131
 
@@ -123,8 +133,10 @@ def _sample_configuration(*, agent_id: str | None = "agent-1") -> ManagedAgentSp
123
133
  def _sample_agent(
124
134
  *,
125
135
  configuration: ManagedAgentSpec | None = None,
136
+ agent_id: str = "agent-1",
137
+ name: str = "planner",
126
138
  ) -> ManagedAgent:
127
- configuration = configuration or _sample_configuration()
139
+ configuration = configuration or _sample_configuration(agent_id=agent_id, name=name)
128
140
  return ManagedAgent(
129
141
  id=configuration.id or "agent-1",
130
142
  name=configuration.name,
@@ -269,7 +281,9 @@ async def test_agent_list_command_outputs_current_agent_shape(
269
281
  {
270
282
  "project_id": "resolved-project",
271
283
  "page_size": 100,
284
+ "continuation_token": None,
272
285
  "filter": None,
286
+ "view": "my",
273
287
  }
274
288
  ]
275
289
  assert printed == [
@@ -287,6 +301,71 @@ async def test_agent_list_command_outputs_current_agent_shape(
287
301
  assert client.closed is True
288
302
 
289
303
 
304
+ @pytest.mark.asyncio
305
+ async def test_agent_list_command_fetches_all_before_name_sort_and_offset(
306
+ monkeypatch: pytest.MonkeyPatch,
307
+ ) -> None:
308
+ client = _FakeAgentClient()
309
+ client.list_agents_page_results = [
310
+ AgentsPage(
311
+ agents=[
312
+ _sample_agent(agent_id=f"agent-{index}", name=f"agent-{index:03}")
313
+ for index in range(60, 160)
314
+ ],
315
+ continuation_token="cursor-1",
316
+ ),
317
+ AgentsPage(
318
+ agents=[
319
+ _sample_agent(agent_id=f"agent-{index}", name=f"agent-{index:03}")
320
+ for index in range(60)
321
+ ],
322
+ continuation_token=None,
323
+ ),
324
+ ]
325
+ printed: list[str] = []
326
+ _patch_agent_command(monkeypatch, client=client)
327
+ monkeypatch.setattr(agents, "print", lambda value: printed.append(value))
328
+
329
+ await agents.agent_list_command(
330
+ project_id="project-1",
331
+ count=150,
332
+ offset=10,
333
+ filter="planner",
334
+ o="json",
335
+ )
336
+
337
+ assert client.list_agents_calls == [
338
+ {
339
+ "project_id": "resolved-project",
340
+ "page_size": 100,
341
+ "continuation_token": None,
342
+ "filter": "planner",
343
+ "view": "my",
344
+ },
345
+ {
346
+ "project_id": "resolved-project",
347
+ "page_size": 100,
348
+ "continuation_token": "cursor-1",
349
+ "filter": "planner",
350
+ "view": "my",
351
+ },
352
+ ]
353
+ output = json.loads(printed[0])
354
+ assert len(output) == 150
355
+ assert output[0]["name"] == "agent-010"
356
+ assert output[-1]["name"] == "agent-159"
357
+ assert client.closed is True
358
+
359
+
360
+ @pytest.mark.asyncio
361
+ async def test_agent_list_rejects_unsupported_order() -> None:
362
+ with pytest.raises(typer.BadParameter, match='Only "agent_name" is supported'):
363
+ await agents.agent_list_command(
364
+ project_id="project-1",
365
+ order_by="created_at",
366
+ )
367
+
368
+
290
369
  @pytest.mark.asyncio
291
370
  async def test_agent_use_session_starts_thread_without_stopping_websocket_client() -> (
292
371
  None
@@ -137,6 +137,7 @@ from meshagent.agents.process import (
137
137
  TurnInstructionsProvider,
138
138
  )
139
139
  from meshagent.api import Participant, RoomException
140
+ from meshagent.api.messaging import Content
140
141
  from meshagent.cli import async_typer, auth_async
141
142
  from meshagent.cli._filedrop import (
142
143
  dropped_file_paths_from_text,
@@ -348,6 +349,7 @@ def _format_ask_tool_call_entry_text(
348
349
  toolkit: str,
349
350
  tool: str,
350
351
  arguments: dict[str, Any] | None,
352
+ result: Content | dict[str, object] | None = None,
351
353
  logs: list[str],
352
354
  error_message: str | None,
353
355
  completed: bool = True,
@@ -357,6 +359,7 @@ def _format_ask_tool_call_entry_text(
357
359
  toolkit=toolkit,
358
360
  tool=tool,
359
361
  arguments=arguments,
362
+ result=result,
360
363
  failed=failed,
361
364
  completed=completed,
362
365
  )
@@ -539,6 +542,21 @@ async def _send_chat_thread_prompt(
539
542
  await session.start_thread(text=prompt, attachments=file_attachments)
540
543
 
541
544
 
545
+ async def _run_ask_chat_thread_prompt(
546
+ *,
547
+ session: ChatThreadSession,
548
+ prompt: str,
549
+ attachments: Sequence[_AskInputAttachment],
550
+ on_message: Callable[[AgentMessage], Awaitable[None] | None],
551
+ ) -> None:
552
+ """Run a TUI turn while forwarding each event exactly as it arrives."""
553
+ await session.ask(
554
+ prompt=prompt,
555
+ attachments=attachments,
556
+ on_message=on_message,
557
+ )
558
+
559
+
542
560
  class _AgentMessageChannelClient(Protocol):
543
561
  @property
544
562
  def has_thread_path(self) -> bool: ...
@@ -3866,10 +3884,11 @@ async def _run_ask_tui(
3866
3884
  prompt: str,
3867
3885
  attachments: Sequence[_AskInputAttachment] = (),
3868
3886
  ) -> None:
3869
- await _send_chat_thread_prompt(
3887
+ await _run_ask_chat_thread_prompt(
3870
3888
  session=session,
3871
3889
  prompt=prompt,
3872
3890
  attachments=attachments,
3891
+ on_message=self._handle_agent_message,
3873
3892
  )
3874
3893
 
3875
3894
  async def _finalize_active_assistant(self) -> None:
@@ -4685,6 +4704,7 @@ async def _run_ask_tui(
4685
4704
  toolkit=toolkit,
4686
4705
  tool=tool,
4687
4706
  arguments=arguments,
4707
+ result=message.result,
4688
4708
  logs=logs,
4689
4709
  error_message=error_message,
4690
4710
  )
@@ -173,6 +173,122 @@ class _FakeTTY:
173
173
  return self._is_tty
174
174
 
175
175
 
176
+ @pytest.mark.asyncio
177
+ async def test_run_ask_chat_thread_prompt_forwards_streamed_deltas_once() -> None:
178
+ delivered: list[object] = []
179
+ rendered_text = ""
180
+ render_snapshots: list[str] = []
181
+
182
+ class _StreamingSession:
183
+ async def ask(self, *, prompt, attachments, on_message):
184
+ assert prompt == "stream this"
185
+ assert attachments == ()
186
+ messages = (
187
+ AgentTextContentStarted(
188
+ type=AGENT_EVENT_TEXT_CONTENT_STARTED,
189
+ thread_id="/threads/process-run",
190
+ turn_id="turn-1",
191
+ item_id="item-1",
192
+ ),
193
+ AgentTextContentDelta(
194
+ type=AGENT_EVENT_TEXT_CONTENT_DELTA,
195
+ thread_id="/threads/process-run",
196
+ turn_id="turn-1",
197
+ item_id="item-1",
198
+ text="Hello ",
199
+ ),
200
+ AgentTextContentDelta(
201
+ type=AGENT_EVENT_TEXT_CONTENT_DELTA,
202
+ thread_id="/threads/process-run",
203
+ turn_id="turn-1",
204
+ item_id="item-1",
205
+ text="world",
206
+ ),
207
+ AgentTextContentEnded(
208
+ type=AGENT_EVENT_TEXT_CONTENT_ENDED,
209
+ thread_id="/threads/process-run",
210
+ turn_id="turn-1",
211
+ item_id="item-1",
212
+ ),
213
+ )
214
+ for message in messages:
215
+ await ask_module._maybe_await(on_message(message))
216
+ # The aggregate return value must not be rendered after the deltas.
217
+ return "Hello world"
218
+
219
+ async def _render(message) -> None:
220
+ nonlocal rendered_text
221
+ delivered.append(message)
222
+ if isinstance(message, AgentTextContentDelta):
223
+ rendered_text += message.text
224
+ render_snapshots.append(rendered_text)
225
+
226
+ await ask_module._run_ask_chat_thread_prompt(
227
+ session=_StreamingSession(),
228
+ prompt="stream this",
229
+ attachments=(),
230
+ on_message=_render,
231
+ )
232
+
233
+ assert render_snapshots == ["Hello ", "Hello world"]
234
+ assert rendered_text == "Hello world"
235
+ assert [type(message) for message in delivered] == [
236
+ AgentTextContentStarted,
237
+ AgentTextContentDelta,
238
+ AgentTextContentDelta,
239
+ AgentTextContentEnded,
240
+ ]
241
+
242
+
243
+ @pytest.mark.asyncio
244
+ async def test_run_ask_chat_thread_prompt_preserves_sequential_turn_context() -> None:
245
+ completed_prompts: list[str] = []
246
+ request_contexts: list[tuple[str, ...]] = []
247
+
248
+ class _ContextualSession:
249
+ async def ask(self, *, prompt, attachments, on_message):
250
+ assert attachments == ()
251
+ request_contexts.append((*completed_prompts, prompt))
252
+ item_id = f"item-{len(request_contexts)}"
253
+ await ask_module._maybe_await(
254
+ on_message(
255
+ AgentTextContentDelta(
256
+ type=AGENT_EVENT_TEXT_CONTENT_DELTA,
257
+ thread_id="/threads/process-run",
258
+ turn_id=f"turn-{len(request_contexts)}",
259
+ item_id=item_id,
260
+ text=f"response to {prompt}",
261
+ )
262
+ )
263
+ )
264
+ completed_prompts.extend((prompt, f"response to {prompt}"))
265
+ return f"response to {prompt}"
266
+
267
+ session = _ContextualSession()
268
+ delivered: list[AgentTextContentDelta] = []
269
+ await ask_module._run_ask_chat_thread_prompt(
270
+ session=session,
271
+ prompt="first prompt",
272
+ attachments=(),
273
+ on_message=delivered.append,
274
+ )
275
+ await ask_module._run_ask_chat_thread_prompt(
276
+ session=session,
277
+ prompt="second prompt",
278
+ attachments=(),
279
+ on_message=delivered.append,
280
+ )
281
+
282
+ assert request_contexts == [
283
+ ("first prompt",),
284
+ ("first prompt", "response to first prompt", "second prompt"),
285
+ ]
286
+ assert [message.text for message in delivered] == [
287
+ "response to first prompt",
288
+ "response to second prompt",
289
+ ]
290
+
291
+
176
292
  async def _local_chat_session(
177
293
  send_message,
178
294
  ) -> tuple[ask_module.LocalChatClient, ask_module._AgentMessageSession]:
@@ -376,5 +376,12 @@ SHELL_RENDERERS = {
376
376
  }
377
377
 
378
378
 
379
+ def main() -> None:
380
+ from meshagent.agents.channel_process import dispatch_main
381
+
382
+ if not dispatch_main(executable_name=Path(sys.argv[0]).name, argv=sys.argv[1:]):
383
+ raise SystemExit(app())
384
+
385
+
379
386
  if __name__ == "__main__":
380
- app()
387
+ main()
@@ -5,6 +5,7 @@ import types
5
5
  import pytest
6
6
 
7
7
  from meshagent.api import RoomException
8
+ from meshagent.agents import channel_process
8
9
  from meshagent.cli import async_typer
9
10
  from meshagent.cli import cli
10
11
  from meshagent.cli.testing import CliRunner
@@ -132,6 +133,17 @@ def test_app_prints_room_exception_without_traceback(capsys) -> None:
132
133
  assert captured.out == ""
133
134
 
134
135
 
136
+ def test_main_exits_with_status_returned_by_async_typer(monkeypatch) -> None:
137
+ monkeypatch.setattr(channel_process, "dispatch_main", lambda **kwargs: False)
138
+ monkeypatch.setattr(cli, "app", lambda: 23)
139
+ monkeypatch.setattr(sys, "argv", ["meshagent", "build"])
140
+
141
+ with pytest.raises(SystemExit) as exc_info:
142
+ cli.main()
143
+
144
+ assert exc_info.value.code == 23
145
+
146
+
135
147
  def test_room_help_lists_agents_command() -> None:
136
148
  result = CliRunner().invoke(cli.app, ["room", "--help"])
137
149