meshagent-cli 0.53.0__tar.gz → 0.53.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/PKG-INFO +17 -17
  2. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/cli.py +5 -0
  3. meshagent_cli-0.53.2/meshagent/cli/sysadmin.py +5 -0
  4. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/users.py +195 -17
  5. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/users_test.py +94 -8
  6. meshagent_cli-0.53.2/meshagent/cli/version.py +1 -0
  7. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/PKG-INFO +17 -17
  8. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/SOURCES.txt +1 -0
  9. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/requires.txt +16 -16
  10. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/pyproject.toml +16 -16
  11. meshagent_cli-0.53.0/meshagent/cli/version.py +0 -1
  12. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/LICENSE +0 -0
  13. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/README.md +0 -0
  14. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/__init__.py +0 -0
  15. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/_filedrop.py +0 -0
  16. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agent.py +0 -0
  17. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agent_cli_options_test.py +0 -0
  18. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agent_package_cli.py +0 -0
  19. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agent_package_cli_test.py +0 -0
  20. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agents.py +0 -0
  21. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/agents_test.py +0 -0
  22. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/ask.py +0 -0
  23. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/ask_test.py +0 -0
  24. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/async_typer.py +0 -0
  25. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/async_typer_test.py +0 -0
  26. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/auth.py +0 -0
  27. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/auth_async.py +0 -0
  28. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/auth_async_test.py +0 -0
  29. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/auth_test.py +0 -0
  30. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/call.py +0 -0
  31. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/chatbot.py +0 -0
  32. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/cli_mcp.py +0 -0
  33. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/cli_test.py +0 -0
  34. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/common_options.py +0 -0
  35. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/config.py +0 -0
  36. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/config_test.py +0 -0
  37. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/containers.py +0 -0
  38. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/containers_test.py +0 -0
  39. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create.py +0 -0
  40. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/__init__.py +0 -0
  41. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
  42. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
  43. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/slack-channel/channel.py +0 -0
  44. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/slack-channel/scripts/configure-slack.py +0 -0
  45. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/slack-channel/scripts/setup-slack-dev-route.py +0 -0
  46. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/slack-channel/server.py +0 -0
  47. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
  48. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/telegram-channel/channel.py +0 -0
  49. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/configure-telegram.py +0 -0
  50. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/create-bot-token.py +0 -0
  51. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/telegram-channel/server.py +0 -0
  52. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/twilio-channel/channel.py +0 -0
  53. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/twilio-channel/server.py +0 -0
  54. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
  55. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/whatsapp-channel/channel.py +0 -0
  56. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_project_templates/python/whatsapp-channel/server.py +0 -0
  57. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/create_test.py +0 -0
  58. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/custom_domains.py +0 -0
  59. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/custom_domains_test.py +0 -0
  60. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/dataset.py +0 -0
  61. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/dataset_test.py +0 -0
  62. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/developer.py +0 -0
  63. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/developer_test.py +0 -0
  64. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/doctor.py +0 -0
  65. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
  66. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/doctor_templates/__init__.py +0 -0
  67. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/doctor_test.py +0 -0
  68. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/feeds.py +0 -0
  69. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/feeds_test.py +0 -0
  70. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/helper.py +0 -0
  71. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/helper_test.py +0 -0
  72. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/helpers.py +0 -0
  73. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/host.py +0 -0
  74. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/iam.py +0 -0
  75. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/iam_test.py +0 -0
  76. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/image.py +0 -0
  77. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/image_test.py +0 -0
  78. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/launch.py +0 -0
  79. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/launch_test.py +0 -0
  80. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/llm.py +0 -0
  81. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/llm_test.py +0 -0
  82. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/local_settings.py +0 -0
  83. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/local_settings_test.py +0 -0
  84. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mailbot.py +0 -0
  85. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mailbot_test.py +0 -0
  86. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mailboxes.py +0 -0
  87. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mailboxes_test.py +0 -0
  88. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/meeting_transcriber.py +0 -0
  89. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/memory.py +0 -0
  90. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/memory_test.py +0 -0
  91. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/meshagent_images.py +0 -0
  92. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/meshagent_images_test.py +0 -0
  93. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/messaging.py +0 -0
  94. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/messaging_test.py +0 -0
  95. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/mounts.py +0 -0
  96. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/multi.py +0 -0
  97. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/oauth_clients.py +0 -0
  98. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/oauth_clients_test.py +0 -0
  99. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/oci_archive.py +0 -0
  100. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/oci_archive_test.py +0 -0
  101. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/participant_token.py +0 -0
  102. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/port.py +0 -0
  103. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/port_test.py +0 -0
  104. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/preamble_rules.py +0 -0
  105. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/preamble_rules_test.py +0 -0
  106. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/process.py +0 -0
  107. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/process_live_test.py +0 -0
  108. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/process_test.py +0 -0
  109. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/projects.py +0 -0
  110. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/projects_test.py +0 -0
  111. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/queue.py +0 -0
  112. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/queue_test.py +0 -0
  113. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/registry.py +0 -0
  114. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/registry_test.py +0 -0
  115. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room.py +0 -0
  116. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room_connect.py +0 -0
  117. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room_connect_test.py +0 -0
  118. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room_services.py +0 -0
  119. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/room_services_test.py +0 -0
  120. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/rooms.py +0 -0
  121. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/rooms_test.py +0 -0
  122. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/root_commands.py +0 -0
  123. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/root_commands_test.py +0 -0
  124. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/routes.py +0 -0
  125. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/routes_test.py +0 -0
  126. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sample_channel_http_test.py +0 -0
  127. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sample_channel_live_e2e_test.py +0 -0
  128. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/scheduled_tasks.py +0 -0
  129. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/scheduled_tasks_test.py +0 -0
  130. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/secrets.py +0 -0
  131. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/secrets_test.py +0 -0
  132. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/service_accounts.py +0 -0
  133. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/service_accounts_test.py +0 -0
  134. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/services.py +0 -0
  135. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/services_test.py +0 -0
  136. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sessions.py +0 -0
  137. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sessions_test.py +0 -0
  138. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite.py +0 -0
  139. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite_recovery.py +0 -0
  140. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite_recovery_test.py +0 -0
  141. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite_test.py +0 -0
  142. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sqlite_transfer_test.py +0 -0
  143. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/storage.py +0 -0
  144. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/storage_test.py +0 -0
  145. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/subscriptions.py +0 -0
  146. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sync.py +0 -0
  147. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/sync_test.py +0 -0
  148. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/task_runner.py +0 -0
  149. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/task_runner_test.py +0 -0
  150. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/test.py +0 -0
  151. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/testing.py +0 -0
  152. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/thread_inspect.py +0 -0
  153. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/thread_inspect_test.py +0 -0
  154. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/thread_sidebar.py +0 -0
  155. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tool_call_summary.py +0 -0
  156. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tool_call_summary_test.py +0 -0
  157. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tool_integrations.py +0 -0
  158. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tool_integrations_test.py +0 -0
  159. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/__init__.py +0 -0
  160. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/auth_switch.py +0 -0
  161. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/auth_switch_test.py +0 -0
  162. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/create.py +0 -0
  163. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/deploy_room.py +0 -0
  164. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/deploy_room_test.py +0 -0
  165. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/project_activate.py +0 -0
  166. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/project_activate_test.py +0 -0
  167. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/setup.py +0 -0
  168. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/setup_splash_frames.py +0 -0
  169. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/tui/setup_test.py +0 -0
  170. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/version_check.py +0 -0
  171. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/version_check_test.py +0 -0
  172. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/voicebot.py +0 -0
  173. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/volumes.py +0 -0
  174. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/volumes_test.py +0 -0
  175. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/webserver.py +0 -0
  176. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/webserver_test.py +0 -0
  177. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/worker.py +0 -0
  178. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent/cli/worker_test.py +0 -0
  179. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  180. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/entry_points.txt +0 -0
  181. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/meshagent_cli.egg-info/top_level.txt +0 -0
  182. {meshagent_cli-0.53.0 → meshagent_cli-0.53.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.53.0
3
+ Version: 0.53.2
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.53.0
26
- Requires-Dist: meshagent-codex==0.53.0
25
+ Requires-Dist: meshagent-llm-proxy==0.53.2
26
+ Requires-Dist: meshagent-codex==0.53.2
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.53.0; extra == "all"
36
- Requires-Dist: meshagent-api[all]==0.53.0; extra == "all"
37
- Requires-Dist: meshagent-commoncrawl==0.53.0; extra == "all"
38
- Requires-Dist: meshagent-scrapy==0.53.0; extra == "all"
39
- Requires-Dist: meshagent-computers==0.53.0; extra == "all"
40
- Requires-Dist: meshagent-openai==0.53.0; extra == "all"
41
- Requires-Dist: meshagent-anthropic==0.53.0; extra == "all"
42
- Requires-Dist: meshagent-otel==0.53.0; extra == "all"
43
- Requires-Dist: meshagent-mcp==0.53.0; extra == "all"
44
- Requires-Dist: meshagent-tools==0.53.0; extra == "all"
35
+ Requires-Dist: meshagent-agents[all]==0.53.2; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.53.2; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.53.2; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.53.2; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.53.2; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.53.2; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.53.2; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.53.2; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.53.2; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.53.2; 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.53.0; extra == "mcp-service"
49
- Requires-Dist: meshagent-api==0.53.0; extra == "mcp-service"
50
- Requires-Dist: meshagent-mcp==0.53.0; extra == "mcp-service"
51
- Requires-Dist: meshagent-tools==0.53.0; extra == "mcp-service"
48
+ Requires-Dist: meshagent-agents[all]==0.53.2; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.53.2; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.53.2; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.53.2; extra == "mcp-service"
52
52
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
53
53
  Dynamic: license-file
54
54
 
@@ -108,6 +108,11 @@ app.add_lazy_command(
108
108
  module="meshagent.cli.iam",
109
109
  help="Manage IAM policies for project resources",
110
110
  )
111
+ app.add_lazy_command(
112
+ name="sysadmin",
113
+ module="meshagent.cli.sysadmin",
114
+ help="Administer global account profiles",
115
+ )
111
116
  app.add_lazy_command(
112
117
  name="user",
113
118
  module="meshagent.cli.users",
@@ -0,0 +1,5 @@
1
+ from meshagent.cli import async_typer
2
+ from meshagent.cli.users import sysadmin_app
3
+
4
+ app = async_typer.AsyncTyper(help="Platform administration; requires sysadmin access")
5
+ app.add_typer(sysadmin_app, name="user")
@@ -1,21 +1,46 @@
1
1
  import json
2
2
  import math
3
+ from enum import Enum
3
4
  from typing import Annotated
4
5
 
5
6
  import typer
7
+ from meshagent.api import RoomException
8
+ from meshagent.api.client import ProjectMembersPage, UpdateUserProfileRequest, User
9
+ from meshagent.cli import async_typer
10
+ from meshagent.cli.common_options import OutputFormatOption, ProjectIdOption
11
+ from meshagent.cli.helper import get_client, resolve_project_id
6
12
  from pydantic import JsonValue, TypeAdapter
7
13
  from rich import print
8
14
  from rich.console import Console
9
15
  from rich.table import Table
10
16
  from rich.text import Text
11
17
 
12
- from meshagent.api import RoomException
13
- from meshagent.api.client import ProjectMembersPage, User
14
- from meshagent.cli import async_typer
15
- from meshagent.cli.common_options import OutputFormatOption, ProjectIdOption
16
- from meshagent.cli.helper import get_client, resolve_project_id
17
-
18
18
  app = async_typer.AsyncTyper(help="List project users and manage user profiles")
19
+
20
+
21
+ class ProfileView(str, Enum):
22
+ project = "project"
23
+ user = "user"
24
+ merged = "merged"
25
+
26
+
27
+ class ProfileField(str, Enum):
28
+ first_name = "first_name"
29
+ last_name = "last_name"
30
+ metadata = "metadata"
31
+ annotations = "annotations"
32
+
33
+
34
+ ProfileViewOption = Annotated[
35
+ ProfileView, typer.Option("--view", help="Profile attributes to return")
36
+ ]
37
+ GlobalOption = Annotated[
38
+ bool,
39
+ typer.Option(
40
+ "--global", help="Use your global account profile, ignoring the active project"
41
+ ),
42
+ ]
43
+
19
44
  UserIdArgument = Annotated[
20
45
  str, typer.Argument(help="User id, or me for your own profile")
21
46
  ]
@@ -91,6 +116,7 @@ def _print_table(records: list[dict[str, object]], *columns: str) -> None:
91
116
  async def list_users(
92
117
  *,
93
118
  project_id: ProjectIdOption,
119
+ view: ProfileViewOption = ProfileView.merged,
94
120
  count: Annotated[
95
121
  int, typer.Option("--count", min=1, help="Maximum number of users to return")
96
122
  ] = 100,
@@ -114,6 +140,7 @@ async def list_users(
114
140
  page_size=min(count - len(result.users), 100),
115
141
  continuation_token=result.continuation_token,
116
142
  filter=filter,
143
+ view=view.value,
117
144
  )
118
145
  if (
119
146
  page.continuation_token is not None
@@ -127,7 +154,9 @@ async def list_users(
127
154
  finally:
128
155
  await client.close()
129
156
  if o == "json":
130
- _print_json(result.model_dump(mode="json"))
157
+ _print_json(
158
+ result.model_dump(mode="json", exclude_unset=view == ProfileView.project)
159
+ )
131
160
  return
132
161
  if not result.users:
133
162
  print("No users found")
@@ -154,25 +183,42 @@ async def list_users(
154
183
 
155
184
 
156
185
  @app.async_command(
157
- "get", help="Get a user profile, including metadata and annotations."
186
+ "get", help="Get a project user profile or your global account profile."
158
187
  )
159
188
  async def get(
160
- *, user_id: UserIdArgument = "me", o: OutputFormatOption = "table"
189
+ *,
190
+ user_id: UserIdArgument = "me",
191
+ project_id: ProjectIdOption,
192
+ view: ProfileViewOption = ProfileView.merged,
193
+ global_profile: GlobalOption = False,
194
+ o: OutputFormatOption = "table",
161
195
  ) -> None:
162
196
  _validate_output(o)
197
+ if global_profile:
198
+ project_id = None
199
+ if view == ProfileView.project and project_id is None:
200
+ raise typer.BadParameter("--view project requires --project-id")
163
201
  client = await get_client()
164
202
  try:
165
- user = User.model_validate(await client.get_user_profile(user_id))
203
+ row = await client.get_user_profile(
204
+ user_id, project_id=project_id, view=view.value
205
+ )
166
206
  finally:
167
207
  await client.close()
168
- row = user.model_dump(mode="json")
169
208
  if o == "json":
170
209
  _print_json(row)
171
210
  return
172
- row["metadata"] = json.dumps(user.metadata)
173
- row["annotations"] = json.dumps(user.annotations)
211
+ _print_profile(row)
212
+
213
+
214
+ def _print_profile(row: dict) -> None:
215
+ values = {
216
+ name: row.get(name) for name in ("id", "email", "first_name", "last_name")
217
+ }
218
+ values["metadata"] = json.dumps(row.get("metadata", {}))
219
+ values["annotations"] = json.dumps(row.get("annotations", {}))
174
220
  _print_table(
175
- [row], "id", "email", "first_name", "last_name", "metadata", "annotations"
221
+ [values], "id", "email", "first_name", "last_name", "metadata", "annotations"
176
222
  )
177
223
 
178
224
 
@@ -183,6 +229,13 @@ async def update(
183
229
  *,
184
230
  project_id: ProjectIdOption,
185
231
  user_id: UserIdArgument = "me",
232
+ global_profile: GlobalOption = False,
233
+ inherit: Annotated[
234
+ list[ProfileField] | None,
235
+ typer.Option(
236
+ "--inherit", help="Remove a project override; repeat for multiple fields"
237
+ ),
238
+ ] = None,
186
239
  first_name: Annotated[
187
240
  str | None, typer.Option("--first-name", help="First name")
188
241
  ] = None,
@@ -204,12 +257,31 @@ async def update(
204
257
  o: OutputFormatOption = "table",
205
258
  ) -> None:
206
259
  _validate_output(o)
207
- if all(value is None for value in (first_name, last_name, metadata, annotations)):
260
+ if (
261
+ all(value is None for value in (first_name, last_name, metadata, annotations))
262
+ and not inherit
263
+ ):
208
264
  raise typer.BadParameter("supply at least one profile field to update")
209
265
  parsed_metadata = _parse_object(metadata, "metadata")
210
266
  parsed_annotations = _parse_annotations(annotations)
211
- if parsed_annotations is not None:
212
- project_id = await resolve_project_id(project_id=project_id)
267
+ if global_profile:
268
+ project_id = None
269
+ if parsed_annotations is not None and project_id is None:
270
+ raise typer.BadParameter(
271
+ "Global annotations require the sysadmin user update command"
272
+ )
273
+ if inherit and project_id is None:
274
+ raise typer.BadParameter("--inherit requires --project-id")
275
+ supplied = {
276
+ "first_name": first_name,
277
+ "last_name": last_name,
278
+ "metadata": metadata,
279
+ "annotations": annotations,
280
+ }
281
+ if inherit and any(supplied[field.value] is not None for field in inherit):
282
+ raise typer.BadParameter(
283
+ "A field cannot be supplied and inherited in the same update"
284
+ )
213
285
  client = await get_client()
214
286
  try:
215
287
  result = await client.update_user_profile(
@@ -219,6 +291,7 @@ async def update(
219
291
  metadata=parsed_metadata,
220
292
  annotations=parsed_annotations,
221
293
  project_id=project_id,
294
+ **({"inherit": [field.value for field in inherit]} if inherit else {}),
222
295
  )
223
296
  finally:
224
297
  await client.close()
@@ -226,3 +299,108 @@ async def update(
226
299
  _print_json(result)
227
300
  else:
228
301
  print("User profile updated")
302
+
303
+
304
+ sysadmin_app = async_typer.AsyncTyper(
305
+ help="Search and edit global user profiles; requires sysadmin access"
306
+ )
307
+
308
+
309
+ @sysadmin_app.async_command(
310
+ "list", help="Search global users by email, name, or user id."
311
+ )
312
+ async def list_sysadmin_users(
313
+ *,
314
+ filter: Annotated[str | None, typer.Option("--filter")] = None,
315
+ count: Annotated[int, typer.Option("--count", min=1)] = 100,
316
+ continuation_token: Annotated[
317
+ str | None, typer.Option("--continuation-token")
318
+ ] = None,
319
+ o: OutputFormatOption = "table",
320
+ ) -> None:
321
+ _validate_output(o)
322
+ client = await get_client()
323
+ records: list[User] = []
324
+ try:
325
+ while len(records) < count:
326
+ page = await client.search_sysadmin_users(
327
+ filter=filter,
328
+ page_size=min(count - len(records), 100),
329
+ continuation_token=continuation_token,
330
+ )
331
+ records.extend(page.users)
332
+ if (
333
+ page.continuation_token == continuation_token
334
+ and page.continuation_token is not None
335
+ ):
336
+ raise RoomException("User listing continuation token did not advance")
337
+ continuation_token = page.continuation_token
338
+ if continuation_token is None:
339
+ break
340
+ finally:
341
+ await client.close()
342
+ rows = [record.model_dump(mode="json") for record in records]
343
+ if o == "json":
344
+ _print_json({"users": rows, "continuation_token": continuation_token})
345
+ else:
346
+ _print_table(rows, "id", "email", "first_name", "last_name")
347
+ if continuation_token is not None:
348
+ typer.echo(f"Continuation token: {continuation_token}")
349
+
350
+
351
+ @sysadmin_app.async_command("get", help="Get a global user profile.")
352
+ async def get_sysadmin_user(
353
+ *, user_id: UserIdArgument = "me", o: OutputFormatOption = "table"
354
+ ) -> None:
355
+ _validate_output(o)
356
+ client = await get_client()
357
+ try:
358
+ user = await client.get_sysadmin_user_profile(user_id)
359
+ finally:
360
+ await client.close()
361
+ row = user.model_dump(mode="json")
362
+ if o == "json":
363
+ _print_json(row)
364
+ else:
365
+ _print_profile(row)
366
+
367
+
368
+ @sysadmin_app.async_command(
369
+ "update", help="Update global names, metadata, or annotations."
370
+ )
371
+ async def update_sysadmin_user(
372
+ *,
373
+ user_id: UserIdArgument = "me",
374
+ first_name: Annotated[str | None, typer.Option("--first-name")] = None,
375
+ last_name: Annotated[str | None, typer.Option("--last-name")] = None,
376
+ metadata: Annotated[
377
+ str | None, typer.Option("--metadata", help="Replacement JSON object")
378
+ ] = None,
379
+ annotations: Annotated[
380
+ str | None, typer.Option("--annotations", help="Replacement string map")
381
+ ] = None,
382
+ o: OutputFormatOption = "table",
383
+ ) -> None:
384
+ _validate_output(o)
385
+ if all(value is None for value in (first_name, last_name, metadata, annotations)):
386
+ raise typer.BadParameter("supply at least one profile field to update")
387
+ fields = {
388
+ key: value
389
+ for key, value in {
390
+ "first_name": first_name,
391
+ "last_name": last_name,
392
+ "metadata": _parse_object(metadata, "metadata"),
393
+ "annotations": _parse_annotations(annotations),
394
+ }.items()
395
+ if value is not None
396
+ }
397
+ update = UpdateUserProfileRequest.model_validate(fields)
398
+ client = await get_client()
399
+ try:
400
+ result = await client.update_sysadmin_user_profile(user_id, update=update)
401
+ finally:
402
+ await client.close()
403
+ if o == "json":
404
+ _print_json(result)
405
+ else:
406
+ print("Global user profile updated")
@@ -3,14 +3,17 @@ import logging
3
3
  from dataclasses import dataclass, field
4
4
 
5
5
  import pytest
6
- from pydantic import JsonValue
7
- from rich.console import Console
8
-
9
6
  from meshagent.api import RoomException
10
- from meshagent.api.client import ProjectMemberAccess, ProjectMembersPage, User
7
+ from meshagent.api.client import (
8
+ ProjectMemberAccess,
9
+ ProjectMembersPage,
10
+ User,
11
+ UserProfilesPage,
12
+ )
11
13
  from meshagent.cli import cli, users
12
14
  from meshagent.cli.testing import CliRunner
13
-
15
+ from pydantic import JsonValue
16
+ from rich.console import Console
14
17
 
15
18
  PROFILE = User(
16
19
  id="user-1",
@@ -42,13 +45,16 @@ class FakeClient:
42
45
  page_size: int,
43
46
  continuation_token: str | None,
44
47
  filter: str | None,
48
+ view: str = "merged",
45
49
  ) -> ProjectMembersPage:
46
50
  self.list_calls.append((project_id, page_size, continuation_token, filter))
47
51
  if self.error:
48
52
  raise self.error
49
53
  return self.pages.pop(0)
50
54
 
51
- async def get_user_profile(self, user_id: str) -> dict[str, object]:
55
+ async def get_user_profile(
56
+ self, user_id: str, *, project_id: str | None = None, view: str = "merged"
57
+ ) -> dict[str, object]:
52
58
  self.get_calls.append(user_id)
53
59
  if self.error:
54
60
  raise self.error
@@ -63,6 +69,7 @@ class FakeClient:
63
69
  metadata: dict[str, JsonValue] | None,
64
70
  annotations: dict[str, str] | None,
65
71
  project_id: str | None,
72
+ inherit: list[str] | None = None,
66
73
  ) -> dict[str, bool]:
67
74
  self.update_calls.append(
68
75
  {
@@ -78,6 +85,28 @@ class FakeClient:
78
85
  raise self.error
79
86
  return {"ok": True}
80
87
 
88
+ async def search_sysadmin_users(
89
+ self, *, filter=None, page_size=100, continuation_token=None
90
+ ):
91
+ self.list_calls.append(("sysadmin", page_size, continuation_token, filter))
92
+ if self.error:
93
+ raise self.error
94
+ return UserProfilesPage(users=[PROFILE])
95
+
96
+ async def get_sysadmin_user_profile(self, user_id):
97
+ self.get_calls.append(user_id)
98
+ if self.error:
99
+ raise self.error
100
+ return PROFILE
101
+
102
+ async def update_sysadmin_user_profile(self, user_id, *, update):
103
+ self.update_calls.append(
104
+ {"user_id": user_id, **update.model_dump(exclude_unset=True)}
105
+ )
106
+ if self.error:
107
+ raise self.error
108
+ return {"ok": True}
109
+
81
110
 
82
111
  @pytest.fixture
83
112
  def client(
@@ -300,8 +329,8 @@ def test_annotations_require_project_before_client_creation(
300
329
  monkeypatch.setattr("meshagent.cli.helper.get_active_project", no_project)
301
330
  result = CliRunner().invoke(users.app, ["update", "--annotations", "{}"])
302
331
 
303
- assert result.exit_code == 1, result.output
304
- assert "Project ID not specified" in result.output
332
+ assert result.exit_code == 2, result.output
333
+ assert "sysadmin user update" in result.output
305
334
  assert not client.update_calls and not client.closed
306
335
 
307
336
 
@@ -319,3 +348,60 @@ def test_api_errors_are_reported_and_client_closed(
319
348
  assert error.value.code == 1
320
349
  assert "user_profile_editor is required" in capsys.readouterr().err
321
350
  assert client.closed
351
+
352
+
353
+ @pytest.mark.parametrize(
354
+ "args",
355
+ [
356
+ ["list", "--filter", "alice", "-o", "json"],
357
+ ["get", "user-1", "-o", "json"],
358
+ ["update", "user-1", "--annotations", '{"verified":"yes"}', "-o", "json"],
359
+ ],
360
+ )
361
+ def test_sysadmin_user_commands_use_global_admin_apis(args, client):
362
+ result = CliRunner().invoke(cli.app, ["sysadmin", "user", *args])
363
+ assert result.exit_code == 0, result.output
364
+ assert client.closed
365
+ if args[0] == "list":
366
+ assert json.loads(result.stdout)["users"][0]["id"] == "user-1"
367
+ assert client.list_calls == [("sysadmin", 100, None, "alice")]
368
+ elif args[0] == "update":
369
+ assert client.update_calls == [
370
+ {"user_id": "user-1", "annotations": {"verified": "yes"}}
371
+ ]
372
+
373
+
374
+ @pytest.mark.parametrize(
375
+ "args", [["get", "user-1"], ["list"], ["update", "user-1", "--annotations", "{}"]]
376
+ )
377
+ def test_sysadmin_cli_reports_denials_and_closes_client(args, client, capsys):
378
+ client.error = RoomException("Status=403, body=sysadmin is required")
379
+ with pytest.raises(SystemExit):
380
+ users.sysadmin_app(args)
381
+ assert "sysadmin is required" in capsys.readouterr().err
382
+ assert client.closed
383
+
384
+
385
+ def test_global_flag_ignores_active_project(client, monkeypatch):
386
+ monkeypatch.setenv("MESHAGENT_PROJECT_ID", "project-1")
387
+ result = CliRunner().invoke(
388
+ users.app, ["update", "--global", "--first-name", "Global"]
389
+ )
390
+ assert result.exit_code == 0, result.output
391
+ assert client.update_calls[0]["project_id"] is None
392
+
393
+
394
+ @pytest.mark.parametrize(
395
+ "args",
396
+ [
397
+ ["get", "--view", "invalid"],
398
+ ["get", "--view", "project"],
399
+ ["update", "--inherit", "metadata"],
400
+ ["update", "--project-id", "p", "--inherit", "email"],
401
+ ["update", "--project-id", "p", "--inherit", "metadata", "--metadata", "{}"],
402
+ ],
403
+ )
404
+ def test_invalid_views_and_inheritance_are_rejected_before_api_calls(args, client):
405
+ result = CliRunner().invoke(users.app, args)
406
+ assert result.exit_code == 2, result.output
407
+ assert not client.get_calls and not client.update_calls
@@ -0,0 +1 @@
1
+ __version__ = "0.53.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.53.0
3
+ Version: 0.53.2
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.53.0
26
- Requires-Dist: meshagent-codex==0.53.0
25
+ Requires-Dist: meshagent-llm-proxy==0.53.2
26
+ Requires-Dist: meshagent-codex==0.53.2
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.53.0; extra == "all"
36
- Requires-Dist: meshagent-api[all]==0.53.0; extra == "all"
37
- Requires-Dist: meshagent-commoncrawl==0.53.0; extra == "all"
38
- Requires-Dist: meshagent-scrapy==0.53.0; extra == "all"
39
- Requires-Dist: meshagent-computers==0.53.0; extra == "all"
40
- Requires-Dist: meshagent-openai==0.53.0; extra == "all"
41
- Requires-Dist: meshagent-anthropic==0.53.0; extra == "all"
42
- Requires-Dist: meshagent-otel==0.53.0; extra == "all"
43
- Requires-Dist: meshagent-mcp==0.53.0; extra == "all"
44
- Requires-Dist: meshagent-tools==0.53.0; extra == "all"
35
+ Requires-Dist: meshagent-agents[all]==0.53.2; extra == "all"
36
+ Requires-Dist: meshagent-api[all]==0.53.2; extra == "all"
37
+ Requires-Dist: meshagent-commoncrawl==0.53.2; extra == "all"
38
+ Requires-Dist: meshagent-scrapy==0.53.2; extra == "all"
39
+ Requires-Dist: meshagent-computers==0.53.2; extra == "all"
40
+ Requires-Dist: meshagent-openai==0.53.2; extra == "all"
41
+ Requires-Dist: meshagent-anthropic==0.53.2; extra == "all"
42
+ Requires-Dist: meshagent-otel==0.53.2; extra == "all"
43
+ Requires-Dist: meshagent-mcp==0.53.2; extra == "all"
44
+ Requires-Dist: meshagent-tools==0.53.2; 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.53.0; extra == "mcp-service"
49
- Requires-Dist: meshagent-api==0.53.0; extra == "mcp-service"
50
- Requires-Dist: meshagent-mcp==0.53.0; extra == "mcp-service"
51
- Requires-Dist: meshagent-tools==0.53.0; extra == "mcp-service"
48
+ Requires-Dist: meshagent-agents[all]==0.53.2; extra == "mcp-service"
49
+ Requires-Dist: meshagent-api==0.53.2; extra == "mcp-service"
50
+ Requires-Dist: meshagent-mcp==0.53.2; extra == "mcp-service"
51
+ Requires-Dist: meshagent-tools==0.53.2; extra == "mcp-service"
52
52
  Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
53
53
  Dynamic: license-file
54
54
 
@@ -117,6 +117,7 @@ meshagent/cli/storage_test.py
117
117
  meshagent/cli/subscriptions.py
118
118
  meshagent/cli/sync.py
119
119
  meshagent/cli/sync_test.py
120
+ meshagent/cli/sysadmin.py
120
121
  meshagent/cli/task_runner.py
121
122
  meshagent/cli/task_runner_test.py
122
123
  meshagent/cli/test.py
@@ -11,8 +11,8 @@ openpyxl~=3.1
11
11
  xlsxwriter~=3.2
12
12
  pathspec<2,>=1.0.3
13
13
  zstandard~=0.25.0
14
- meshagent-llm-proxy==0.53.0
15
- meshagent-codex==0.53.0
14
+ meshagent-llm-proxy==0.53.2
15
+ meshagent-codex==0.53.2
16
16
  rich~=14.3.0
17
17
  sounddevice~=0.5
18
18
  textual<9.0,>=8.2.3
@@ -22,22 +22,22 @@ ascii-magic~=2.3
22
22
  pillow~=11.3.0
23
23
 
24
24
  [all]
25
- meshagent-agents[all]==0.53.0
26
- meshagent-api[all]==0.53.0
27
- meshagent-commoncrawl==0.53.0
28
- meshagent-scrapy==0.53.0
29
- meshagent-computers==0.53.0
30
- meshagent-openai==0.53.0
31
- meshagent-anthropic==0.53.0
32
- meshagent-otel==0.53.0
33
- meshagent-mcp==0.53.0
34
- meshagent-tools==0.53.0
25
+ meshagent-agents[all]==0.53.2
26
+ meshagent-api[all]==0.53.2
27
+ meshagent-commoncrawl==0.53.2
28
+ meshagent-scrapy==0.53.2
29
+ meshagent-computers==0.53.2
30
+ meshagent-openai==0.53.2
31
+ meshagent-anthropic==0.53.2
32
+ meshagent-otel==0.53.2
33
+ meshagent-mcp==0.53.2
34
+ meshagent-tools==0.53.2
35
35
  supabase-auth~=2.28.0
36
36
  prompt-toolkit~=3.0.52
37
37
 
38
38
  [mcp-service]
39
- meshagent-agents[all]==0.53.0
40
- meshagent-api==0.53.0
41
- meshagent-mcp==0.53.0
42
- meshagent-tools==0.53.0
39
+ meshagent-agents[all]==0.53.2
40
+ meshagent-api==0.53.2
41
+ meshagent-mcp==0.53.2
42
+ meshagent-tools==0.53.2
43
43
  supabase-auth~=2.28.0