meshagent-cli 0.46.4__tar.gz → 0.47.0__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.0}/PKG-INFO +17 -17
  2. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agent_package_cli.py +2 -34
  3. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agent_package_cli_test.py +4 -4
  4. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agents.py +41 -3
  5. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agents_test.py +86 -7
  6. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/ask.py +17 -1
  7. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/ask_test.py +116 -0
  8. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/cli.py +4 -1
  9. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create.py +149 -2
  10. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/slack-channel/channel.py +1517 -0
  11. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/slack-channel/scripts/configure-slack.py +563 -0
  12. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/slack-channel/scripts/setup-slack-dev-route.py +659 -0
  13. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/slack-channel/server.py +119 -0
  14. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/telegram-channel/channel.py +1845 -0
  15. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/telegram-channel/scripts/configure-telegram.py +597 -0
  16. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/telegram-channel/scripts/create-bot-token.py +316 -0
  17. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/telegram-channel/server.py +88 -0
  18. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/twilio-channel/channel.py +1411 -0
  19. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/twilio-channel/server.py +118 -0
  20. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/whatsapp-channel/channel.py +2700 -0
  21. meshagent_cli-0.47.0/meshagent/cli/create_project_templates/python/whatsapp-channel/server.py +104 -0
  22. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_test.py +1637 -1
  23. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/feeds.py +29 -1
  24. meshagent_cli-0.47.0/meshagent/cli/feeds_test.py +158 -0
  25. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/helper.py +2 -2
  26. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/helper_test.py +5 -0
  27. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/image.py +32 -1
  28. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/image_test.py +109 -0
  29. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/llm_test.py +31 -0
  30. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/mailboxes.py +37 -5
  31. meshagent_cli-0.47.0/meshagent/cli/mailboxes_test.py +152 -0
  32. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/process.py +87 -6
  33. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/process_test.py +114 -76
  34. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room_connect.py +8 -2
  35. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room_connect_test.py +59 -6
  36. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/rooms.py +15 -4
  37. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/rooms_test.py +67 -2
  38. meshagent_cli-0.47.0/meshagent/cli/sample_channel_http_test.py +352 -0
  39. meshagent_cli-0.47.0/meshagent/cli/sample_channel_live_e2e_test.py +96 -0
  40. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/scheduled_tasks.py +64 -11
  41. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/scheduled_tasks_test.py +126 -10
  42. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/thread_inspect.py +93 -1
  43. meshagent_cli-0.47.0/meshagent/cli/thread_inspect_test.py +248 -0
  44. meshagent_cli-0.47.0/meshagent/cli/version.py +1 -0
  45. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/PKG-INFO +17 -17
  46. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/SOURCES.txt +15 -0
  47. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/requires.txt +16 -16
  48. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/pyproject.toml +16 -16
  49. meshagent_cli-0.46.4/meshagent/cli/mailboxes_test.py +0 -43
  50. meshagent_cli-0.46.4/meshagent/cli/thread_inspect_test.py +0 -66
  51. meshagent_cli-0.46.4/meshagent/cli/version.py +0 -1
  52. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/LICENSE +0 -0
  53. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/README.md +0 -0
  54. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/__init__.py +0 -0
  55. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/_filedrop.py +0 -0
  56. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agent.py +0 -0
  57. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/agent_cli_options_test.py +0 -0
  58. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/async_typer.py +0 -0
  59. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/async_typer_test.py +0 -0
  60. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/auth.py +0 -0
  61. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/auth_async.py +0 -0
  62. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/auth_async_test.py +0 -0
  63. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/auth_test.py +0 -0
  64. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/call.py +0 -0
  65. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/chatbot.py +0 -0
  66. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/cli_mcp.py +0 -0
  67. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/cli_test.py +0 -0
  68. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/common_options.py +0 -0
  69. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/config.py +0 -0
  70. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/config_test.py +0 -0
  71. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/containers.py +0 -0
  72. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/containers_test.py +0 -0
  73. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/__init__.py +0 -0
  74. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
  75. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
  76. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
  77. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
  78. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/dataset.py +0 -0
  79. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/dataset_test.py +0 -0
  80. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/developer.py +0 -0
  81. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/developer_test.py +0 -0
  82. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/doctor.py +0 -0
  83. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  84. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/doctor_templates/__init__.py +0 -0
  85. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/doctor_test.py +0 -0
  86. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/helpers.py +0 -0
  87. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/host.py +0 -0
  88. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/iam.py +0 -0
  89. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/iam_test.py +0 -0
  90. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/launch.py +0 -0
  91. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/launch_test.py +0 -0
  92. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/llm.py +0 -0
  93. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/local_settings.py +0 -0
  94. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/local_settings_test.py +0 -0
  95. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/mailbot.py +0 -0
  96. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/mailbot_test.py +0 -0
  97. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/meeting_transcriber.py +0 -0
  98. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/memory.py +0 -0
  99. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/memory_test.py +0 -0
  100. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/meshagent_images.py +0 -0
  101. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/meshagent_images_test.py +0 -0
  102. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/messaging.py +0 -0
  103. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/messaging_test.py +0 -0
  104. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/multi.py +0 -0
  105. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/oci_archive.py +0 -0
  106. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/oci_archive_test.py +0 -0
  107. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/participant_token.py +0 -0
  108. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/port.py +0 -0
  109. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/port_test.py +0 -0
  110. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/preamble_rules.py +0 -0
  111. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/preamble_rules_test.py +0 -0
  112. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/process_live_test.py +0 -0
  113. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/projects.py +0 -0
  114. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/projects_test.py +0 -0
  115. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/queue.py +0 -0
  116. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/queue_test.py +0 -0
  117. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/registry.py +0 -0
  118. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/registry_test.py +0 -0
  119. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room.py +0 -0
  120. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room_services.py +0 -0
  121. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/room_services_test.py +0 -0
  122. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/root_commands.py +0 -0
  123. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/root_commands_test.py +0 -0
  124. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/routes.py +0 -0
  125. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/routes_test.py +0 -0
  126. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/secrets.py +0 -0
  127. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/secrets_test.py +0 -0
  128. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/service_accounts.py +0 -0
  129. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/service_accounts_test.py +0 -0
  130. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/services.py +0 -0
  131. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/services_test.py +0 -0
  132. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sessions.py +0 -0
  133. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sessions_test.py +0 -0
  134. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sqlite.py +0 -0
  135. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sqlite_test.py +0 -0
  136. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/storage.py +0 -0
  137. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/storage_test.py +0 -0
  138. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/subscriptions.py +0 -0
  139. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sync.py +0 -0
  140. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/sync_test.py +0 -0
  141. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/task_runner.py +0 -0
  142. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/task_runner_test.py +0 -0
  143. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/test.py +0 -0
  144. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/testing.py +0 -0
  145. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/thread_sidebar.py +0 -0
  146. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tool_call_summary.py +0 -0
  147. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tool_call_summary_test.py +0 -0
  148. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tool_integrations.py +0 -0
  149. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tool_integrations_test.py +0 -0
  150. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/__init__.py +0 -0
  151. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/auth_switch.py +0 -0
  152. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/auth_switch_test.py +0 -0
  153. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/create.py +0 -0
  154. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/deploy_room.py +0 -0
  155. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/deploy_room_test.py +0 -0
  156. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/project_activate.py +0 -0
  157. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/project_activate_test.py +0 -0
  158. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/setup.py +0 -0
  159. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  160. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/tui/setup_test.py +0 -0
  161. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/version_check.py +0 -0
  162. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/version_check_test.py +0 -0
  163. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/voicebot.py +0 -0
  164. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/webserver.py +0 -0
  165. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/webserver_test.py +0 -0
  166. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/worker.py +0 -0
  167. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent/cli/worker_test.py +0 -0
  168. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  169. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/entry_points.txt +0 -0
  170. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/meshagent_cli.egg-info/top_level.txt +0 -0
  171. {meshagent_cli-0.46.4 → meshagent_cli-0.47.0}/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.0
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.0
26
+ Requires-Dist: meshagent-codex==0.47.0
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.0; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.47.0; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.47.0; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.47.0; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.47.0; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.47.0; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.47.0; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.47.0; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.47.0; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.47.0; 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.0; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.47.0; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.47.0; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.47.0; 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
@@ -539,6 +539,21 @@ async def _send_chat_thread_prompt(
539
539
  await session.start_thread(text=prompt, attachments=file_attachments)
540
540
 
541
541
 
542
+ async def _run_ask_chat_thread_prompt(
543
+ *,
544
+ session: ChatThreadSession,
545
+ prompt: str,
546
+ attachments: Sequence[_AskInputAttachment],
547
+ on_message: Callable[[AgentMessage], Awaitable[None] | None],
548
+ ) -> None:
549
+ """Run a TUI turn while forwarding each event exactly as it arrives."""
550
+ await session.ask(
551
+ prompt=prompt,
552
+ attachments=attachments,
553
+ on_message=on_message,
554
+ )
555
+
556
+
542
557
  class _AgentMessageChannelClient(Protocol):
543
558
  @property
544
559
  def has_thread_path(self) -> bool: ...
@@ -3866,10 +3881,11 @@ async def _run_ask_tui(
3866
3881
  prompt: str,
3867
3882
  attachments: Sequence[_AskInputAttachment] = (),
3868
3883
  ) -> None:
3869
- await _send_chat_thread_prompt(
3884
+ await _run_ask_chat_thread_prompt(
3870
3885
  session=session,
3871
3886
  prompt=prompt,
3872
3887
  attachments=attachments,
3888
+ on_message=self._handle_agent_message,
3873
3889
  )
3874
3890
 
3875
3891
  async def _finalize_active_assistant(self) -> None:
@@ -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]:
@@ -377,4 +377,7 @@ SHELL_RENDERERS = {
377
377
 
378
378
 
379
379
  if __name__ == "__main__":
380
- app()
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
+ app()