meshagent-cli 0.49.1__tar.gz → 0.50.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 (172) hide show
  1. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/PKG-INFO +17 -17
  2. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/cli_test.py +21 -1
  3. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/process.py +51 -0
  4. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/rooms.py +21 -6
  5. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/rooms_test.py +60 -3
  6. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/services.py +75 -0
  7. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/services_test.py +67 -0
  8. meshagent_cli-0.50.0/meshagent/cli/version.py +1 -0
  9. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/PKG-INFO +17 -17
  10. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/requires.txt +16 -16
  11. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/pyproject.toml +16 -16
  12. meshagent_cli-0.49.1/meshagent/cli/version.py +0 -1
  13. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/LICENSE +0 -0
  14. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/README.md +0 -0
  15. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/__init__.py +0 -0
  16. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/_filedrop.py +0 -0
  17. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agent.py +0 -0
  18. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agent_cli_options_test.py +0 -0
  19. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agent_package_cli.py +0 -0
  20. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agent_package_cli_test.py +0 -0
  21. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agents.py +0 -0
  22. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/agents_test.py +0 -0
  23. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/ask.py +0 -0
  24. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/ask_test.py +0 -0
  25. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/async_typer.py +0 -0
  26. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/async_typer_test.py +0 -0
  27. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/auth.py +0 -0
  28. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/auth_async.py +0 -0
  29. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/auth_async_test.py +0 -0
  30. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/auth_test.py +0 -0
  31. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/call.py +0 -0
  32. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/chatbot.py +0 -0
  33. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/cli.py +0 -0
  34. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/cli_mcp.py +0 -0
  35. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/common_options.py +0 -0
  36. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/config.py +0 -0
  37. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/config_test.py +0 -0
  38. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/containers.py +0 -0
  39. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/containers_test.py +0 -0
  40. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create.py +0 -0
  41. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/__init__.py +0 -0
  42. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
  43. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
  44. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/slack-channel/channel.py +0 -0
  45. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/slack-channel/scripts/configure-slack.py +0 -0
  46. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/slack-channel/scripts/setup-slack-dev-route.py +0 -0
  47. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/slack-channel/server.py +0 -0
  48. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
  49. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/telegram-channel/channel.py +0 -0
  50. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/configure-telegram.py +0 -0
  51. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/create-bot-token.py +0 -0
  52. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/telegram-channel/server.py +0 -0
  53. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/twilio-channel/channel.py +0 -0
  54. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/twilio-channel/server.py +0 -0
  55. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
  56. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/whatsapp-channel/channel.py +0 -0
  57. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_project_templates/python/whatsapp-channel/server.py +0 -0
  58. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/create_test.py +0 -0
  59. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/dataset.py +0 -0
  60. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/dataset_test.py +0 -0
  61. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/developer.py +0 -0
  62. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/developer_test.py +0 -0
  63. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/doctor.py +0 -0
  64. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  65. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/doctor_templates/__init__.py +0 -0
  66. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/doctor_test.py +0 -0
  67. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/feeds.py +0 -0
  68. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/feeds_test.py +0 -0
  69. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/helper.py +0 -0
  70. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/helper_test.py +0 -0
  71. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/helpers.py +0 -0
  72. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/host.py +0 -0
  73. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/iam.py +0 -0
  74. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/iam_test.py +0 -0
  75. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/image.py +0 -0
  76. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/image_test.py +0 -0
  77. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/launch.py +0 -0
  78. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/launch_test.py +0 -0
  79. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/llm.py +0 -0
  80. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/llm_test.py +0 -0
  81. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/local_settings.py +0 -0
  82. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/local_settings_test.py +0 -0
  83. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mailbot.py +0 -0
  84. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mailbot_test.py +0 -0
  85. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mailboxes.py +0 -0
  86. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mailboxes_test.py +0 -0
  87. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/meeting_transcriber.py +0 -0
  88. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/memory.py +0 -0
  89. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/memory_test.py +0 -0
  90. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/meshagent_images.py +0 -0
  91. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/meshagent_images_test.py +0 -0
  92. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/messaging.py +0 -0
  93. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/messaging_test.py +0 -0
  94. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/mounts.py +0 -0
  95. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/multi.py +0 -0
  96. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/oci_archive.py +0 -0
  97. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/oci_archive_test.py +0 -0
  98. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/participant_token.py +0 -0
  99. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/port.py +0 -0
  100. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/port_test.py +0 -0
  101. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/preamble_rules.py +0 -0
  102. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/preamble_rules_test.py +0 -0
  103. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/process_live_test.py +0 -0
  104. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/process_test.py +0 -0
  105. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/projects.py +0 -0
  106. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/projects_test.py +0 -0
  107. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/queue.py +0 -0
  108. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/queue_test.py +0 -0
  109. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/registry.py +0 -0
  110. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/registry_test.py +0 -0
  111. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room.py +0 -0
  112. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room_connect.py +0 -0
  113. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room_connect_test.py +0 -0
  114. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room_services.py +0 -0
  115. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/room_services_test.py +0 -0
  116. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/root_commands.py +0 -0
  117. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/root_commands_test.py +0 -0
  118. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/routes.py +0 -0
  119. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/routes_test.py +0 -0
  120. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sample_channel_http_test.py +0 -0
  121. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sample_channel_live_e2e_test.py +0 -0
  122. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/scheduled_tasks.py +0 -0
  123. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/scheduled_tasks_test.py +0 -0
  124. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/secrets.py +0 -0
  125. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/secrets_test.py +0 -0
  126. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/service_accounts.py +0 -0
  127. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/service_accounts_test.py +0 -0
  128. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sessions.py +0 -0
  129. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sessions_test.py +0 -0
  130. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sqlite.py +0 -0
  131. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sqlite_test.py +0 -0
  132. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/storage.py +0 -0
  133. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/storage_test.py +0 -0
  134. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/subscriptions.py +0 -0
  135. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sync.py +0 -0
  136. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/sync_test.py +0 -0
  137. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/task_runner.py +0 -0
  138. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/task_runner_test.py +0 -0
  139. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/test.py +0 -0
  140. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/testing.py +0 -0
  141. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/thread_inspect.py +0 -0
  142. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/thread_inspect_test.py +0 -0
  143. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/thread_sidebar.py +0 -0
  144. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tool_call_summary.py +0 -0
  145. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tool_call_summary_test.py +0 -0
  146. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tool_integrations.py +0 -0
  147. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tool_integrations_test.py +0 -0
  148. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/__init__.py +0 -0
  149. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/auth_switch.py +0 -0
  150. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/auth_switch_test.py +0 -0
  151. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/create.py +0 -0
  152. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/deploy_room.py +0 -0
  153. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/deploy_room_test.py +0 -0
  154. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/project_activate.py +0 -0
  155. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/project_activate_test.py +0 -0
  156. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/setup.py +0 -0
  157. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  158. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/tui/setup_test.py +0 -0
  159. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/version_check.py +0 -0
  160. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/version_check_test.py +0 -0
  161. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/voicebot.py +0 -0
  162. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/volumes.py +0 -0
  163. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/volumes_test.py +0 -0
  164. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/webserver.py +0 -0
  165. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/webserver_test.py +0 -0
  166. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/worker.py +0 -0
  167. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent/cli/worker_test.py +0 -0
  168. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/SOURCES.txt +0 -0
  169. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  170. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/entry_points.txt +0 -0
  171. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/meshagent_cli.egg-info/top_level.txt +0 -0
  172. {meshagent_cli-0.49.1 → meshagent_cli-0.50.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.49.1
3
+ Version: 0.50.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.49.1
26
- Requires-Dist: meshagent-codex==0.49.1
25
+ Requires-Dist: meshagent-llm-proxy==0.50.0
26
+ Requires-Dist: meshagent-codex==0.50.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.49.1; extra == "all"
36
- Requires-Dist: meshagent-api[all]==0.49.1; extra == "all"
37
- Requires-Dist: meshagent-commoncrawl==0.49.1; extra == "all"
38
- Requires-Dist: meshagent-scrapy==0.49.1; extra == "all"
39
- Requires-Dist: meshagent-computers==0.49.1; extra == "all"
40
- Requires-Dist: meshagent-openai==0.49.1; extra == "all"
41
- Requires-Dist: meshagent-anthropic==0.49.1; extra == "all"
42
- Requires-Dist: meshagent-otel==0.49.1; extra == "all"
43
- Requires-Dist: meshagent-mcp==0.49.1; extra == "all"
44
- Requires-Dist: meshagent-tools==0.49.1; extra == "all"
35
+ Requires-Dist: meshagent-agents[all]==0.50.0; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.50.0; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.50.0; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.50.0; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.50.0; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.50.0; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.50.0; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.50.0; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.50.0; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.50.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.49.1; extra == "mcp-service"
49
- Requires-Dist: meshagent-api==0.49.1; extra == "mcp-service"
50
- Requires-Dist: meshagent-mcp==0.49.1; extra == "mcp-service"
51
- Requires-Dist: meshagent-tools==0.49.1; extra == "mcp-service"
48
+ Requires-Dist: meshagent-agents[all]==0.50.0; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.50.0; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.50.0; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.50.0; extra == "mcp-service"
52
52
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
53
53
  Dynamic: license-file
54
54
 
@@ -4,7 +4,7 @@ import types
4
4
 
5
5
  import pytest
6
6
 
7
- from meshagent.api import RoomException
7
+ from meshagent.api import RoomDisabledError, RoomException
8
8
  from meshagent.agents import channel_process
9
9
  from meshagent.cli import async_typer
10
10
  from meshagent.cli import cli
@@ -134,6 +134,26 @@ def test_app_prints_room_exception_without_traceback(capsys) -> None:
134
134
  assert captured.out == ""
135
135
 
136
136
 
137
+ def test_app_prints_disabled_room_message_and_exits_nonzero(capsys) -> None:
138
+ app = async_typer.AsyncTyper()
139
+
140
+ @app.callback()
141
+ def app_callback() -> None:
142
+ pass
143
+
144
+ @app.command("connect")
145
+ def connect_command() -> None:
146
+ raise RoomDisabledError()
147
+
148
+ with pytest.raises(SystemExit) as exc_info:
149
+ app(["connect"])
150
+
151
+ assert exc_info.value.code == 1
152
+ captured = capsys.readouterr()
153
+ assert captured.err == "This room is currently disabled.\n"
154
+ assert captured.out == ""
155
+
156
+
137
157
  def test_main_exits_with_status_returned_by_async_typer(monkeypatch) -> None:
138
158
  monkeypatch.setattr(channel_process, "dispatch_main", lambda **kwargs: False)
139
159
  monkeypatch.setattr(cli, "app", lambda: 23)
@@ -2178,6 +2178,7 @@ ThreadStorageBackends = ThreadStorageBackend | str | list[str] | tuple[str, ...]
2178
2178
  DEFAULT_PROCESS_THREAD_STORAGE_BACKENDS: tuple[str, ...] = ("dataset",)
2179
2179
  ContextManagementMode = Literal["auto", "standalone", "none"]
2180
2180
  ProcessToolSearchMode = Literal["room", "agent", "none"]
2181
+ LlmDelegationPolicy = Literal["required", "optional"]
2181
2182
 
2182
2183
  ShellCopyEnvOption = Annotated[
2183
2184
  list[str],
@@ -4701,6 +4702,7 @@ def _build_runtime_agent(
4701
4702
  verbose_dataset: bool = False,
4702
4703
  save_audio_input: bool = False,
4703
4704
  preamble_rule: bool = True,
4705
+ llm_delegation: LlmDelegationPolicy = "optional",
4704
4706
  ):
4705
4707
  builder = _builder_for_runtime(runtime)
4706
4708
  selected_models = (
@@ -4790,6 +4792,7 @@ def _build_runtime_agent(
4790
4792
  builder_kwargs["preamble_rule"] = preamble_rule
4791
4793
  builder_kwargs["websocket_auth"] = websocket_auth
4792
4794
  builder_kwargs["room_token"] = room_token
4795
+ builder_kwargs["llm_delegation"] = llm_delegation
4793
4796
  return builder(**builder_kwargs)
4794
4797
 
4795
4798
 
@@ -5482,6 +5485,7 @@ def build_process_agent(
5482
5485
  verbose_dataset: bool = False,
5483
5486
  save_audio_input: bool = False,
5484
5487
  preamble_rule: bool = True,
5488
+ llm_delegation: LlmDelegationPolicy = "optional",
5485
5489
  ):
5486
5490
  from meshagent.agents import (
5487
5491
  AgentMessageThreadStatusPublisher,
@@ -6108,6 +6112,12 @@ def build_process_agent(
6108
6112
  connection = await provider.adapter.create_realtime_connection(
6109
6113
  protocol=protocol,
6110
6114
  model=resolved_model,
6115
+ llm_authorization_token=(
6116
+ start_thread.llm_authorization.token
6117
+ if start_thread.llm_authorization is not None
6118
+ and not start_thread.llm_authorization.is_expired()
6119
+ else None
6120
+ ),
6111
6121
  )
6112
6122
  return AgentRealtimeConnectionInfo(
6113
6123
  protocol=connection.protocol,
@@ -6936,6 +6946,7 @@ def build_process_agent(
6936
6946
  turns=turns,
6937
6947
  )
6938
6948
  ),
6949
+ llm_delegation=llm_delegation,
6939
6950
  )
6940
6951
  if room is not None:
6941
6952
  process.register_content_scheme(_room_content_scheme(room=room))
@@ -7194,6 +7205,13 @@ async def join(
7194
7205
  Optional[str],
7195
7206
  typer.Option(..., help="Delegate LLM interactions to a remote participant"),
7196
7207
  ] = None,
7208
+ llm_delegation: Annotated[
7209
+ LlmDelegationPolicy,
7210
+ typer.Option(
7211
+ "--llm-delegation",
7212
+ help="Require per-turn LLM delegation or allow it when provided.",
7213
+ ),
7214
+ ] = "optional",
7197
7215
  decision_model: DecisionModelOption = None,
7198
7216
  transcription_model: TranscriptionModelOption = (
7199
7217
  DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
@@ -7403,6 +7421,7 @@ async def join(
7403
7421
  require_discovery=require_discovery,
7404
7422
  require_advanced_shell=require_advanced_shell,
7405
7423
  llm_participant=llm_participant,
7424
+ llm_delegation=llm_delegation,
7406
7425
  decision_model=decision_model,
7407
7426
  transcription_model=transcription_model,
7408
7427
  voice=voice,
@@ -7689,6 +7708,13 @@ async def service(
7689
7708
  Optional[str],
7690
7709
  typer.Option(..., help="Delegate LLM interactions to a remote participant"),
7691
7710
  ] = None,
7711
+ llm_delegation: Annotated[
7712
+ LlmDelegationPolicy,
7713
+ typer.Option(
7714
+ "--llm-delegation",
7715
+ help="Require per-turn LLM delegation or allow it when provided.",
7716
+ ),
7717
+ ] = "optional",
7692
7718
  decision_model: DecisionModelOption = None,
7693
7719
  transcription_model: TranscriptionModelOption = (
7694
7720
  DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
@@ -7865,6 +7891,7 @@ async def service(
7865
7891
  require_discovery=require_discovery,
7866
7892
  require_advanced_shell=require_advanced_shell,
7867
7893
  llm_participant=llm_participant,
7894
+ llm_delegation=llm_delegation,
7868
7895
  decision_model=decision_model,
7869
7896
  transcription_model=transcription_model,
7870
7897
  voice=voice,
@@ -8125,6 +8152,13 @@ async def spec(
8125
8152
  Optional[str],
8126
8153
  typer.Option(..., help="Delegate LLM interactions to a remote participant"),
8127
8154
  ] = None,
8155
+ llm_delegation: Annotated[
8156
+ LlmDelegationPolicy,
8157
+ typer.Option(
8158
+ "--llm-delegation",
8159
+ help="Require per-turn LLM delegation or allow it when provided.",
8160
+ ),
8161
+ ] = "optional",
8128
8162
  decision_model: DecisionModelOption = None,
8129
8163
  transcription_model: TranscriptionModelOption = (
8130
8164
  DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
@@ -8281,6 +8315,7 @@ async def spec(
8281
8315
  require_discovery=require_discovery,
8282
8316
  require_advanced_shell=require_advanced_shell,
8283
8317
  llm_participant=llm_participant,
8318
+ llm_delegation=llm_delegation,
8284
8319
  decision_model=decision_model,
8285
8320
  transcription_model=transcription_model,
8286
8321
  voice=voice,
@@ -8557,6 +8592,13 @@ async def deploy(
8557
8592
  Optional[str],
8558
8593
  typer.Option(..., help="Delegate LLM interactions to a remote participant"),
8559
8594
  ] = None,
8595
+ llm_delegation: Annotated[
8596
+ LlmDelegationPolicy,
8597
+ typer.Option(
8598
+ "--llm-delegation",
8599
+ help="Require per-turn LLM delegation or allow it when provided.",
8600
+ ),
8601
+ ] = "optional",
8560
8602
  decision_model: DecisionModelOption = None,
8561
8603
  transcription_model: TranscriptionModelOption = (
8562
8604
  DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
@@ -8716,6 +8758,7 @@ async def deploy(
8716
8758
  require_discovery=require_discovery,
8717
8759
  require_advanced_shell=require_advanced_shell,
8718
8760
  llm_participant=llm_participant,
8761
+ llm_delegation=llm_delegation,
8719
8762
  decision_model=decision_model,
8720
8763
  transcription_model=transcription_model,
8721
8764
  voice=voice,
@@ -11061,6 +11104,13 @@ async def run(
11061
11104
  Optional[str],
11062
11105
  typer.Option(..., help="Delegate LLM interactions to a remote participant"),
11063
11106
  ] = None,
11107
+ llm_delegation: Annotated[
11108
+ LlmDelegationPolicy,
11109
+ typer.Option(
11110
+ "--llm-delegation",
11111
+ help="Require per-turn LLM delegation or allow it when provided.",
11112
+ ),
11113
+ ] = "optional",
11064
11114
  decision_model: DecisionModelOption = None,
11065
11115
  transcription_model: TranscriptionModelOption = (
11066
11116
  DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL
@@ -11375,6 +11425,7 @@ async def run(
11375
11425
  require_discovery=require_discovery,
11376
11426
  require_advanced_shell=require_advanced_shell,
11377
11427
  llm_participant=llm_participant,
11428
+ llm_delegation=llm_delegation,
11378
11429
  decision_model=decision_model,
11379
11430
  transcription_model=transcription_model,
11380
11431
  voice=voice,
@@ -199,6 +199,7 @@ async def room_create_command(
199
199
  "name": room.name,
200
200
  "metadata": room.metadata,
201
201
  "annotations": room.annotations,
202
+ "enabled": room.enabled,
202
203
  },
203
204
  indent=2,
204
205
  )
@@ -245,7 +246,11 @@ async def room_update_command(
245
246
  project_id: ProjectIdOption,
246
247
  id: Annotated[Optional[str], typer.Option(help="Room ID (preferred)")] = None,
247
248
  name: Optional[str] = None,
248
- new_name: Annotated[str, typer.Option(..., help="New room name")],
249
+ new_name: Annotated[Optional[str], typer.Option(help="New room name")] = None,
250
+ enabled: Annotated[
251
+ Optional[bool],
252
+ typer.Option("--enabled/--disabled", help="Enable or disable the room"),
253
+ ] = None,
249
254
  annotations: Annotated[
250
255
  Optional[str],
251
256
  typer.Option(
@@ -255,7 +260,7 @@ async def room_update_command(
255
260
  ] = None,
256
261
  ):
257
262
  """
258
- Update a room's name (ID is preferred; name will be resolved to ID if needed).
263
+ Update a room's name or enabled state (ID is preferred; name will be resolved to ID if needed).
259
264
  """
260
265
  account_client = await get_client()
261
266
  try:
@@ -265,15 +270,23 @@ async def room_update_command(
265
270
  account_client, project_id=project_id, room_id=id, room_name=room_name
266
271
  )
267
272
  annotations_obj = _maybe_parse_string_dict_json("annotations", annotations)
273
+ if new_name is None and annotations_obj is None and enabled is None:
274
+ raise RoomException(
275
+ "Provide at least one of --new-name, --annotations, --enabled, or --disabled."
276
+ )
277
+ if new_name is None:
278
+ current_room = await account_client.get_room(
279
+ project_id=project_id, name=rid
280
+ )
281
+ new_name = current_room.name
268
282
 
269
- print(
270
- f"[bold green]Updating room id={rid} -> name='{new_name}'...[/bold green]"
271
- )
283
+ print(f"[bold green]Updating room id={rid}...[/bold green]")
272
284
  await account_client.update_room(
273
285
  project_id=project_id,
274
286
  room_id=rid,
275
287
  name=new_name,
276
288
  annotations=annotations_obj,
289
+ enabled=enabled,
277
290
  )
278
291
  print("[bold cyan]Room updated.[/bold cyan]")
279
292
  except RoomException as ex:
@@ -348,13 +361,14 @@ async def room_list_command(
348
361
  "name": r.name,
349
362
  "metadata": r.metadata,
350
363
  "annotations": r.annotations,
364
+ "enabled": r.enabled,
351
365
  }
352
366
  for r in rooms
353
367
  ]
354
368
  if o == "json":
355
369
  print(json.dumps(output, indent=2))
356
370
  elif output:
357
- print_json_table(output, "id", "name")
371
+ print_json_table(output, "id", "name", "enabled")
358
372
  else:
359
373
  print("No rooms found.")
360
374
  except RoomException as ex:
@@ -392,6 +406,7 @@ async def room_get_command(
392
406
  "name": r.name,
393
407
  "metadata": r.metadata,
394
408
  "annotations": r.annotations,
409
+ "enabled": r.enabled,
395
410
  },
396
411
  indent=2,
397
412
  )
@@ -20,6 +20,8 @@ class _FakeRoomsClient:
20
20
  self.closed = False
21
21
  self.list_rooms_page_calls: list[dict[str, object]] = []
22
22
  self.create_room_calls: list[dict[str, object]] = []
23
+ self.update_room_calls: list[dict[str, object]] = []
24
+ self.get_room_calls: list[dict[str, object]] = []
23
25
 
24
26
  async def list_rooms_page(
25
27
  self,
@@ -70,6 +72,29 @@ class _FakeRoomsClient:
70
72
  annotations=annotations or {},
71
73
  )
72
74
 
75
+ async def get_room(self, *, project_id: str, name: str) -> Room:
76
+ self.get_room_calls.append({"project_id": project_id, "name": name})
77
+ return self.rooms_result[0]
78
+
79
+ async def update_room(
80
+ self,
81
+ *,
82
+ project_id: str,
83
+ room_id: str,
84
+ name: str,
85
+ annotations: dict[str, str] | None = None,
86
+ enabled: bool | None = None,
87
+ ) -> None:
88
+ self.update_room_calls.append(
89
+ {
90
+ "project_id": project_id,
91
+ "room_id": room_id,
92
+ "name": name,
93
+ "annotations": annotations,
94
+ "enabled": enabled,
95
+ }
96
+ )
97
+
73
98
  async def close(self) -> None:
74
99
  self.closed = True
75
100
 
@@ -83,6 +108,35 @@ def _sample_room() -> Room:
83
108
  )
84
109
 
85
110
 
111
+ @pytest.mark.asyncio
112
+ async def test_room_update_can_disable_without_renaming(
113
+ monkeypatch: pytest.MonkeyPatch,
114
+ ) -> None:
115
+ client = _FakeRoomsClient(rooms_result=[_sample_room()])
116
+ _patch_room_list_command(monkeypatch, client=client)
117
+ monkeypatch.setattr(rooms, "print", lambda *args, **kwargs: None)
118
+
119
+ await rooms.room_update_command(
120
+ project_id="project-1",
121
+ id="room-1",
122
+ enabled=False,
123
+ )
124
+
125
+ assert client.get_room_calls == [
126
+ {"project_id": "resolved-project", "name": "room-1"}
127
+ ]
128
+ assert client.update_room_calls == [
129
+ {
130
+ "project_id": "resolved-project",
131
+ "room_id": "room-1",
132
+ "name": "demo",
133
+ "annotations": None,
134
+ "enabled": False,
135
+ }
136
+ ]
137
+ assert client.closed is True
138
+
139
+
86
140
  def _patch_room_list_command(
87
141
  monkeypatch: pytest.MonkeyPatch,
88
142
  *,
@@ -179,8 +233,9 @@ def test_route_create_help_mentions_short_domains_and_service_id_annotation() ->
179
233
  assert result.exit_code == 0
180
234
  normalized_output = " ".join(result.output.split())
181
235
  assert "Use a short, DNS-safe domain name" in normalized_output
182
- assert "long room-name-derived" in normalized_output
183
- assert "domains may be rejected" in normalized_output
236
+ assert "DNS-safe; long" in normalized_output
237
+ assert "room-name-derived domains" in normalized_output
238
+ assert "may be rejected" in normalized_output
184
239
  assert "meshagent.service.id" in result.output
185
240
 
186
241
 
@@ -220,9 +275,10 @@ async def test_room_list_defaults_to_table_output(
220
275
  "name": "demo",
221
276
  "metadata": {"team": "core"},
222
277
  "annotations": {"meshagent.storage.class": "ephemeral"},
278
+ "enabled": True,
223
279
  }
224
280
  ],
225
- ("id", "name"),
281
+ ("id", "name", "enabled"),
226
282
  )
227
283
  ]
228
284
  assert client.closed is True
@@ -337,6 +393,7 @@ async def test_room_list_json_output_skips_table_printer(
337
393
  "name": "demo",
338
394
  "metadata": {"team": "core"},
339
395
  "annotations": {"meshagent.storage.class": "ephemeral"},
396
+ "enabled": True,
340
397
  }
341
398
  ]
342
399
 
@@ -1810,6 +1810,79 @@ async def service_run(
1810
1810
  await my_client.close()
1811
1811
 
1812
1812
 
1813
+ async def _set_service_enabled(
1814
+ *,
1815
+ project_id: str | None,
1816
+ service_id: str,
1817
+ room: str | None,
1818
+ enabled: bool,
1819
+ ) -> None:
1820
+ client = await get_client()
1821
+ try:
1822
+ resolved_project_id = await resolve_project_id(project_id=project_id)
1823
+ scope = _ServiceCommandScope(room_name=room)
1824
+ service = await _get_service_for_show(
1825
+ client=client,
1826
+ project_id=resolved_project_id,
1827
+ scope=scope,
1828
+ identifier=service_id,
1829
+ )
1830
+ record_id = _require_service_record_id(service)
1831
+ await _update_service_in_scope(
1832
+ client=client,
1833
+ project_id=resolved_project_id,
1834
+ scope=scope,
1835
+ service_id=record_id,
1836
+ spec=service.model_copy(update={"enabled": enabled}),
1837
+ )
1838
+ state = "enabled" if enabled else "disabled"
1839
+ print(f"[green]Service {record_id} {state}.[/]")
1840
+ finally:
1841
+ await client.close()
1842
+
1843
+
1844
+ @app.async_command("enable")
1845
+ async def service_enable(
1846
+ *,
1847
+ project_id: ProjectIdOption,
1848
+ service_id: Annotated[
1849
+ str,
1850
+ typer.Argument(help="Service UUID or metadata name to enable"),
1851
+ ],
1852
+ room: Annotated[
1853
+ Optional[str], typer.Option("--room", help="Room name")
1854
+ ] = os.getenv("MESHAGENT_ROOM"),
1855
+ ):
1856
+ """Enable a service so it can start and run."""
1857
+ await _set_service_enabled(
1858
+ project_id=project_id,
1859
+ service_id=service_id,
1860
+ room=room,
1861
+ enabled=True,
1862
+ )
1863
+
1864
+
1865
+ @app.async_command("disable")
1866
+ async def service_disable(
1867
+ *,
1868
+ project_id: ProjectIdOption,
1869
+ service_id: Annotated[
1870
+ str,
1871
+ typer.Argument(help="Service UUID or metadata name to disable"),
1872
+ ],
1873
+ room: Annotated[
1874
+ Optional[str], typer.Option("--room", help="Room name")
1875
+ ] = os.getenv("MESHAGENT_ROOM"),
1876
+ ):
1877
+ """Disable a service, stopping it and preventing future starts."""
1878
+ await _set_service_enabled(
1879
+ project_id=project_id,
1880
+ service_id=service_id,
1881
+ room=room,
1882
+ enabled=False,
1883
+ )
1884
+
1885
+
1813
1886
  @app.async_command("get")
1814
1887
  async def service_get(
1815
1888
  *,
@@ -1867,6 +1940,7 @@ async def service_list(
1867
1940
  {
1868
1941
  "id": svc.id,
1869
1942
  "name": svc.metadata.name,
1943
+ "enabled": svc.enabled,
1870
1944
  "image": svc.container.image
1871
1945
  if svc.container is not None
1872
1946
  else None,
@@ -1875,6 +1949,7 @@ async def service_list(
1875
1949
  ],
1876
1950
  "id",
1877
1951
  "name",
1952
+ "enabled",
1878
1953
  "image",
1879
1954
  )
1880
1955
  finally:
@@ -298,6 +298,7 @@ def _service_record(
298
298
  id: str,
299
299
  name: str,
300
300
  service_annotation_id: Optional[str],
301
+ enabled: bool = True,
301
302
  ) -> services.ServiceSpec:
302
303
  annotations: dict[str, str] | None = None
303
304
  if service_annotation_id is not None:
@@ -306,6 +307,7 @@ def _service_record(
306
307
  version="v1",
307
308
  kind="Service",
308
309
  id=id,
310
+ enabled=enabled,
309
311
  metadata=services.ServiceMetadata(name=name, annotations=annotations),
310
312
  ports=[],
311
313
  container=None,
@@ -1105,6 +1107,71 @@ async def test_service_update_template_room_prints_only_updated_service_id(
1105
1107
  assert client.closed is True
1106
1108
 
1107
1109
 
1110
+ @pytest.mark.asyncio
1111
+ async def test_service_disable_updates_room_service_by_name(
1112
+ monkeypatch: pytest.MonkeyPatch,
1113
+ ) -> None:
1114
+ printed = _capture_prints(monkeypatch)
1115
+ client = _ServiceCommandClient()
1116
+ service_id = "550e8400-e29b-41d4-a716-446655440000"
1117
+ client.room_services = [
1118
+ _service_record(
1119
+ id=service_id,
1120
+ name="assistant",
1121
+ service_annotation_id=None,
1122
+ )
1123
+ ]
1124
+ _patch_service_command_runtime(monkeypatch, client=client)
1125
+
1126
+ await services.service_disable(
1127
+ project_id=None,
1128
+ service_id="assistant",
1129
+ room="chatbot3",
1130
+ )
1131
+
1132
+ assert client.get_room_by_name_calls == [("project-1", "chatbot3", "assistant")]
1133
+ assert len(client.update_room_calls) == 1
1134
+ assert client.update_room_calls[0][0:3] == (
1135
+ "project-1",
1136
+ "chatbot3",
1137
+ service_id,
1138
+ )
1139
+ assert client.update_room_calls[0][3].enabled is False
1140
+ assert printed == [f"[green]Service {service_id} disabled.[/]"]
1141
+ assert client.closed is True
1142
+
1143
+
1144
+ @pytest.mark.asyncio
1145
+ async def test_service_enable_updates_global_service_by_id(
1146
+ monkeypatch: pytest.MonkeyPatch,
1147
+ ) -> None:
1148
+ printed = _capture_prints(monkeypatch)
1149
+ client = _ServiceCommandClient()
1150
+ service_id = "550e8400-e29b-41d4-a716-446655440000"
1151
+ client.services = [
1152
+ _service_record(
1153
+ id=service_id,
1154
+ name="assistant",
1155
+ service_annotation_id=None,
1156
+ enabled=False,
1157
+ )
1158
+ ]
1159
+ _patch_service_command_runtime(monkeypatch, client=client)
1160
+
1161
+ await services.service_enable(
1162
+ project_id=None,
1163
+ service_id=service_id,
1164
+ room=None,
1165
+ )
1166
+
1167
+ assert client.get_calls == [("project-1", service_id)]
1168
+ assert len(client.update_calls) == 1
1169
+ assert client.update_calls[0][0:2] == ("project-1", service_id)
1170
+ assert client.update_calls[0][2].enabled is True
1171
+ assert printed == [f"[green]Service {service_id} enabled.[/]"]
1172
+ assert client.closed is True
1173
+
1174
+
1108
1175
  @pytest.mark.asyncio
1109
1176
  async def test_service_get_resolves_room_service_by_name(
1110
1177
  monkeypatch: pytest.MonkeyPatch,
@@ -0,0 +1 @@
1
+ __version__ = "0.50.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.49.1
3
+ Version: 0.50.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.49.1
26
- Requires-Dist: meshagent-codex==0.49.1
25
+ Requires-Dist: meshagent-llm-proxy==0.50.0
26
+ Requires-Dist: meshagent-codex==0.50.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.49.1; extra == "all"
36
- Requires-Dist: meshagent-api[all]==0.49.1; extra == "all"
37
- Requires-Dist: meshagent-commoncrawl==0.49.1; extra == "all"
38
- Requires-Dist: meshagent-scrapy==0.49.1; extra == "all"
39
- Requires-Dist: meshagent-computers==0.49.1; extra == "all"
40
- Requires-Dist: meshagent-openai==0.49.1; extra == "all"
41
- Requires-Dist: meshagent-anthropic==0.49.1; extra == "all"
42
- Requires-Dist: meshagent-otel==0.49.1; extra == "all"
43
- Requires-Dist: meshagent-mcp==0.49.1; extra == "all"
44
- Requires-Dist: meshagent-tools==0.49.1; extra == "all"
35
+ Requires-Dist: meshagent-agents[all]==0.50.0; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.50.0; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.50.0; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.50.0; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.50.0; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.50.0; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.50.0; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.50.0; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.50.0; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.50.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.49.1; extra == "mcp-service"
49
- Requires-Dist: meshagent-api==0.49.1; extra == "mcp-service"
50
- Requires-Dist: meshagent-mcp==0.49.1; extra == "mcp-service"
51
- Requires-Dist: meshagent-tools==0.49.1; extra == "mcp-service"
48
+ Requires-Dist: meshagent-agents[all]==0.50.0; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.50.0; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.50.0; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.50.0; extra == "mcp-service"
52
52
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
53
53
  Dynamic: license-file
54
54