vmware-aria 2.3.0__tar.gz → 2.4.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 (210) hide show
  1. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/.claude-plugin/plugin.json +1 -1
  2. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/.mcp.json +1 -1
  3. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/PKG-INFO +8 -1
  4. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/README-CN.md +6 -0
  5. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/README.md +7 -0
  6. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/RELEASE_NOTES.md +9 -0
  7. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/openclaw.plugin.json +1 -1
  8. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/package.json +1 -1
  9. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/pyproject.toml +1 -1
  10. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/server.json +2 -2
  11. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/skills/vmware-aria/SKILL.md +2 -2
  12. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/skills/vmware-aria/references/setup-guide.md +12 -4
  13. vmware_aria-2.4.0/tests/test_policy_roles.py +55 -0
  14. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/uv.lock +4 -4
  15. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/__init__.py +1 -1
  16. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/policy_environment.py +4 -0
  17. vmware_aria-2.4.0/vmware_aria/policy_roles.py +57 -0
  18. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/.clawhubignore +0 -0
  19. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/.env.example +0 -0
  20. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/.gitignore +0 -0
  21. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/Dockerfile +0 -0
  22. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/SECURITY.md +0 -0
  23. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/config.example.yaml +0 -0
  24. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/docker-compose.yml +0 -0
  25. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/examples/mcp-configs/claude-code.json +0 -0
  26. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/examples/mcp-configs/cursor.json +0 -0
  27. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/examples/mcp-configs/goose.json +0 -0
  28. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/skills/vmware-aria/evals/evals.json +0 -0
  29. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/skills/vmware-aria/references/agent-guardrails.md +0 -0
  30. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/skills/vmware-aria/references/capabilities.md +0 -0
  31. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/skills/vmware-aria/references/cli-reference.md +0 -0
  32. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/skills/vmware-aria/references/investigation-protocol.md +0 -0
  33. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/skills/vmware-aria/references/ops-playbooks.md +0 -0
  34. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/smithery.yaml +0 -0
  35. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/__init__.py +0 -0
  36. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/conftest.py +0 -0
  37. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/__init__.py +0 -0
  38. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/__init__.py +0 -0
  39. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/_family.py +0 -0
  40. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/_scores.json +0 -0
  41. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/_scoring.py +0 -0
  42. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/_skill.py +0 -0
  43. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/conftest.py +0 -0
  44. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/test_entity_reachability.py +0 -0
  45. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/test_error_actionability.py +0 -0
  46. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/test_tool_description_quality.py +0 -0
  47. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
  48. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/alert_adapter_childs_no_data.json +0 -0
  49. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/alert_notes_404.json +0 -0
  50. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/alert_notes_empty.json +0 -0
  51. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/alert_vcapp_health.json +0 -0
  52. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/alertdefinition_adapter_childs_no_data.json +0 -0
  53. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/alertdefinition_vcapp_health.json +0 -0
  54. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/contributingsymptoms_vcapp_health.json +0 -0
  55. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/host_relationships_all.json +0 -0
  56. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/host_relationships_child.json +0 -0
  57. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/host_relationships_parent.json +0 -0
  58. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/host_statkey_definitions.json +0 -0
  59. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/maintenanceschedules_empty.json +0 -0
  60. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/node_status_503.json +0 -0
  61. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/platform_adapters.json +0 -0
  62. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/platform_node_statkey_definitions.json +0 -0
  63. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/platform_node_statkeys.json +0 -0
  64. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/platform_resources_node.json +0 -0
  65. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/platform_resources_watchdog.json +0 -0
  66. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/platform_stats_latest.json +0 -0
  67. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/platform_stats_query.json +0 -0
  68. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/platform_watchdog_statkey_definitions.json +0 -0
  69. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/platform_watchdog_statkeys.json +0 -0
  70. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/properties_bulk_vcapp_services.json +0 -0
  71. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/recommendation_404.json +0 -0
  72. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/recommendations_by_id_adapter_childs.json +0 -0
  73. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/recommendations_by_id_vcapp.json +0 -0
  74. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/resource_test_llm.json +0 -0
  75. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/service_resource_mem.json +0 -0
  76. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/services_info.json +0 -0
  77. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/stats_query_mixed.json +0 -0
  78. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/stats_query_no_values.json +0 -0
  79. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/symptoms_ignores_id_filter.json +0 -0
  80. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/topn_no_groups.json +0 -0
  81. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vcapp_children.json +0 -0
  82. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/versions_current.json +0 -0
  83. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vm_properties.json +0 -0
  84. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vm_relationships_all.json +0 -0
  85. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vm_relationships_child.json +0 -0
  86. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vm_relationships_parent.json +0 -0
  87. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vm_resource_test_llm.json +0 -0
  88. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vm_statkey_definitions.json +0 -0
  89. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vm_statkey_definitions_full.json +0 -0
  90. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vm_statkeys.json +0 -0
  91. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/fixtures/aria_8187/vm_statkeys_180.json +0 -0
  92. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/__init__.py +0 -0
  93. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/_live_8187.py +0 -0
  94. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/fixtures/aria_8187_alerts.json +0 -0
  95. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/fixtures/aria_8187_rightsizing.json +0 -0
  96. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_a_9x_only_404_is_not_a_bad_id.py +0 -0
  97. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_alert_ids_are_pasteable_and_times_readable.py +0 -0
  98. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_alert_notes.py +0 -0
  99. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_alert_recommendations.py +0 -0
  100. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_anomaly_count_is_total_anomalies.py +0 -0
  101. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_anomaly_limit_bounds_the_answer.py +0 -0
  102. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_aria_spec_conformance.py +0 -0
  103. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_aria_spec_shapes.py +0 -0
  104. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_aria_specific.py +0 -0
  105. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_cached_loader_agrees_with_the_resolver.py +0 -0
  106. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_capability_grader.py +0 -0
  107. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_cli_value_errors_are_usage_errors.py +0 -0
  108. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_cli_writes_guarded.py +0 -0
  109. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_credential_env_override.py +0 -0
  110. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_destructive_cli_asks_twice.py +0 -0
  111. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_doctor_does_not_send_you_to_doctor.py +0 -0
  112. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_doctor_uses_the_config_the_tools_use.py +0 -0
  113. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_documented_metric_keys_exist.py +0 -0
  114. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_empty_metrics_say_why.py +0 -0
  115. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_empty_vs_unrecognized.py +0 -0
  116. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_env_secret_obfuscation.py +0 -0
  117. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_fleet_rows_survive_the_container_key.py +0 -0
  118. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_health_degraded_is_not_down.py +0 -0
  119. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_health_says_what_it_observed.py +0 -0
  120. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_ids_must_be_uuid_shaped.py +0 -0
  121. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_instructions_name_targets.py +0 -0
  122. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_live_8187_alert_names.py +0 -0
  123. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_maintenance_mode.py +0 -0
  124. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_maintenance_schedules.py +0 -0
  125. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_mcp_parity.py +0 -0
  126. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_metrics_interval.py +0 -0
  127. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_metrics_summary.py +0 -0
  128. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_paging_loop_terminates.py +0 -0
  129. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_platform_adapters.py +0 -0
  130. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_platform_node_resources.py +0 -0
  131. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_platform_surfaces.py +0 -0
  132. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_product_version_is_read_and_parseable.py +0 -0
  133. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_release_blockers.py +0 -0
  134. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_report_fields_do_not_lie.py +0 -0
  135. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_resource_catalog.py +0 -0
  136. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_resource_list_says_which_objects_stopped_reporting.py +0 -0
  137. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_result_envelope.py +0 -0
  138. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_rightsizing_live_8187.py +0 -0
  139. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_rightsizing_recommendation_history.py +0 -0
  140. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_service_health_is_not_the_badge.py +0 -0
  141. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_stats_n1.py +0 -0
  142. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_text_io_declares_encoding.py +0 -0
  143. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_top_consumers_value_is_the_ranking.py +0 -0
  144. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_vcapp_symptoms_name_their_resources.py +0 -0
  145. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_vcf91_fleet_spec.py +0 -0
  146. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_verify_ssl_false_needs_no_urllib3.py +0 -0
  147. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/eval/regression/test_version_gated_calls_declare_their_floor.py +0 -0
  148. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/test_api_escape.py +0 -0
  149. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/test_config.py +0 -0
  150. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/test_gated_writes.py +0 -0
  151. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/test_init_and_onboarding.py +0 -0
  152. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/test_investigate.py +0 -0
  153. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/test_no_destructive_ops.py +0 -0
  154. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/test_safe_error_passthrough.py +0 -0
  155. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/tests/test_session_pool.py +0 -0
  156. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/api_spec/vcf91_fleet_operations.json +0 -0
  157. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/api_spec/vcfops91_operations.json +0 -0
  158. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/api_spec/vrops86_operations.json +0 -0
  159. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/cli.py +0 -0
  160. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/cli_api.py +0 -0
  161. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/cli_catalog.py +0 -0
  162. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/cli_platform.py +0 -0
  163. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/cli_workflow.py +0 -0
  164. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/config.py +0 -0
  165. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/connection.py +0 -0
  166. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/doctor.py +0 -0
  167. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/init_wizard.py +0 -0
  168. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/__init__.py +0 -0
  169. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/__main__.py +0 -0
  170. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/_shared.py +0 -0
  171. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/server.py +0 -0
  172. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/__init__.py +0 -0
  173. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/alert_definitions.py +0 -0
  174. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/alert_workflow.py +0 -0
  175. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/alerts.py +0 -0
  176. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/anomaly.py +0 -0
  177. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/api.py +0 -0
  178. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/capacity.py +0 -0
  179. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/catalog.py +0 -0
  180. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/fleet.py +0 -0
  181. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/health.py +0 -0
  182. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/maintenance.py +0 -0
  183. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/reports.py +0 -0
  184. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/mcp_server/tools/resources.py +0 -0
  185. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/notify/__init__.py +0 -0
  186. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/notify/audit.py +0 -0
  187. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/__init__.py +0 -0
  188. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/_collection.py +0 -0
  189. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/_ids.py +0 -0
  190. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/_paging.py +0 -0
  191. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/alert_notes.py +0 -0
  192. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/alert_recommendations.py +0 -0
  193. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/alerts.py +0 -0
  194. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/anomaly.py +0 -0
  195. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/api_escape.py +0 -0
  196. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/capacity.py +0 -0
  197. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/catalog.py +0 -0
  198. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/fleet.py +0 -0
  199. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/gate_measures.py +0 -0
  200. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/health.py +0 -0
  201. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/investigate.py +0 -0
  202. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/maintenance.py +0 -0
  203. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/metric_summary.py +0 -0
  204. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/platform.py +0 -0
  205. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/promql.py +0 -0
  206. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/reports.py +0 -0
  207. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/resources.py +0 -0
  208. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/service_state.py +0 -0
  209. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/symptom_resources.py +0 -0
  210. {vmware_aria-2.3.0 → vmware_aria-2.4.0}/vmware_aria/ops/write_gate.py +0 -0
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
3
  "name": "vmware-aria",
4
4
  "displayName": "VMware Aria",
5
- "version": "2.3.0",
5
+ "version": "2.4.0",
6
6
  "description": "VMware Aria Operations: metrics, alerts, capacity, anomaly detection — 46 MCP tools.",
7
7
  "author": {
8
8
  "name": "Wei Zhou",
@@ -5,7 +5,7 @@
5
5
  "command": "uvx",
6
6
  "args": [
7
7
  "--from",
8
- "vmware-aria==2.3.0",
8
+ "vmware-aria==2.4.0",
9
9
  "vmware-aria-mcp"
10
10
  ]
11
11
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vmware-aria
3
- Version: 2.3.0
3
+ Version: 2.4.0
4
4
  Summary: VMware Aria Operations (vRealize Operations) monitoring, alerting, and capacity planning
5
5
  Project-URL: Homepage, https://github.com/vmware-skills/VMware-Aria
6
6
  Project-URL: Repository, https://github.com/vmware-skills/VMware-Aria
@@ -289,11 +289,18 @@ claude mcp add --transport http vmware-aria https://mcp.example.com:8443/mcp \
289
289
  before it binds that unauthenticated requests get 401. Use a certificate your clients trust for those names.
290
290
  - Behind a TLS-terminating reverse proxy on the same machine use `--transport http --host 127.0.0.1
291
291
  --public-name mcp.example.com` and pass the `Authorization` header through.
292
+ - Behind a load balancer or gateway on another machine, keep `--transport https` (a self-signed certificate is
293
+ fine), list in `--public-name` the host name the balancer sends as `Host`, and have it forward `Authorization`.
294
+ Its health probe can use `GET /healthz`, which needs no token and returns only `{"status": "ok"}`
295
+ (vmware-policy ≥ 1.23.0).
296
+ - Send `traceparent` or `X-Request-ID` with each request to have it stored on the audit row;
297
+ `vmware-audit log --correlation-id ID` then finds the calls behind one platform request.
292
298
  - The audit log records each caller as `token:<name>`. Calls run side by side: each holds its own session to a
293
299
  target, up to `VMWARE_MCP_POOL_SIZE` (default 2) sessions per target. Each session is a login on the target; a
294
300
  call waits at most 300 s for a free one.
295
301
  - **Everyone who can reach the endpoint acts with this server's account.** Tokens identify callers; they grant
296
302
  nothing on the platform. Run one endpoint per privilege level.
303
+ - **Several people or roles on one endpoint:** run `vmware-audit roles enable` once, then give each token a role (`vmware-audit token create NAME --role reader`, or a role in `roles.yaml` naming tools and targets; vmware-policy ≥ 1.24.0). A role limits what the token may call on this endpoint; it cannot grant more than the account has. See vmware-policy's README, "Roles for network callers".
297
304
 
298
305
  **Offer only read tools, plus the writes you choose:**
299
306
 
@@ -243,10 +243,16 @@ claude mcp add --transport http vmware-aria https://mcp.example.com:8443/mcp \
243
243
  证书要用客户端信任、且覆盖这些名字的证书。
244
244
  - 在同一台机器上由反向代理终结 TLS 时,用 `--transport http --host 127.0.0.1 --public-name mcp.example.com`,
245
245
  并让代理透传 `Authorization` 头。
246
+ - 负载均衡或网关在另一台机器上时,保持 `--transport https`(自签证书也可以),在 `--public-name` 里写上负载均衡
247
+ 转发时带的 `Host` 名,并让它透传 `Authorization`。健康检查可以用 `GET /healthz`:不需要 token,只返回
248
+ `{"status": "ok"}`(需 vmware-policy ≥ 1.23.0)。
249
+ - 每个请求带上 `traceparent` 或 `X-Request-ID`,它会记进审计记录;用 `vmware-audit log --correlation-id ID`
250
+ 就能查到平台上某一次请求对应的调用。
246
251
  - 审计日志把每个调用者记为 `token:<名字>`。调用并行执行:每个调用独占一个到 target 的会话,每个 target 最多
247
252
  `VMWARE_MCP_POOL_SIZE`(默认 2)个会话。每个会话都是在 target 上的一次登录;调用最多等待 300 秒拿到空闲会话。
248
253
  - **能连到这个端点的人,都以该 server 配置的账号操作。** token 只用来识别调用者,不在平台上授予任何权限。
249
254
  每个权限级别单独起一个端点。
255
+ - **一个端点给多人或多种角色用:** 先运行一次 `vmware-audit roles enable`,再给每个 token 指定角色(`vmware-audit token create 名字 --role reader`,或在 `roles.yaml` 里定义可用的工具和 target;需 vmware-policy ≥ 1.24.0)。角色只能限定这个 token 在本端点上能调用什么,不能超出账号本身的权限。详见 vmware-policy README 的「网络调用者的角色」一节。
250
256
 
251
257
  **只提供读工具,加上你选定的写工具:**
252
258
 
@@ -264,11 +264,18 @@ claude mcp add --transport http vmware-aria https://mcp.example.com:8443/mcp \
264
264
  before it binds that unauthenticated requests get 401. Use a certificate your clients trust for those names.
265
265
  - Behind a TLS-terminating reverse proxy on the same machine use `--transport http --host 127.0.0.1
266
266
  --public-name mcp.example.com` and pass the `Authorization` header through.
267
+ - Behind a load balancer or gateway on another machine, keep `--transport https` (a self-signed certificate is
268
+ fine), list in `--public-name` the host name the balancer sends as `Host`, and have it forward `Authorization`.
269
+ Its health probe can use `GET /healthz`, which needs no token and returns only `{"status": "ok"}`
270
+ (vmware-policy ≥ 1.23.0).
271
+ - Send `traceparent` or `X-Request-ID` with each request to have it stored on the audit row;
272
+ `vmware-audit log --correlation-id ID` then finds the calls behind one platform request.
267
273
  - The audit log records each caller as `token:<name>`. Calls run side by side: each holds its own session to a
268
274
  target, up to `VMWARE_MCP_POOL_SIZE` (default 2) sessions per target. Each session is a login on the target; a
269
275
  call waits at most 300 s for a free one.
270
276
  - **Everyone who can reach the endpoint acts with this server's account.** Tokens identify callers; they grant
271
277
  nothing on the platform. Run one endpoint per privilege level.
278
+ - **Several people or roles on one endpoint:** run `vmware-audit roles enable` once, then give each token a role (`vmware-audit token create NAME --role reader`, or a role in `roles.yaml` naming tools and targets; vmware-policy ≥ 1.24.0). A role limits what the token may call on this endpoint; it cannot grant more than the account has. See vmware-policy's README, "Roles for network callers".
272
279
 
273
280
  **Offer only read tools, plus the writes you choose:**
274
281
 
@@ -1,3 +1,12 @@
1
+ ## v2.4.0 — roles for network callers (HLD §18)
2
+
3
+ * Declares the role metadata vmware-policy ≥ 1.24.0 needs to apply **roles** to this server over HTTPS
4
+ (HLD §18): how a missing target resolves, and that `get_api_path` escapes a role (it reads any indexed API path, account and credential listings included). With an older vmware-policy nothing changes. Once an operator runs
5
+ `vmware-audit roles enable`, a token's role decides which tools and targets it may use here; a refused call is
6
+ audited as `denied`. See vmware-policy's README, "Roles for network callers".
7
+ * A target-limited role is checked against the same config the connection uses: the copy the server's connection manager loaded on its first connection. Edit `config.yaml` and restart for both to see the change.
8
+ * README and setup guide: one endpoint for several people or roles.
9
+
1
10
  ## v2.3.0 — calls run side by side; read-only raw API escape hatch
2
11
 
3
12
  **Calls no longer wait for each other** (HLD §16 D-13(2), via vmware-policy 1.22.0). When one server serves several
@@ -11,7 +11,7 @@
11
11
  "command": "uvx",
12
12
  "args": [
13
13
  "--from",
14
- "vmware-aria==2.3.0",
14
+ "vmware-aria==2.4.0",
15
15
  "vmware-aria-mcp"
16
16
  ]
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zw008/vmware-aria",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "VMware Aria Operations: metrics, alerts, capacity, anomaly detection — 46 MCP tools.",
5
5
  "private": true,
6
6
  "license": "MIT",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "vmware-aria"
7
- version = "2.3.0"
7
+ version = "2.4.0"
8
8
  description = "VMware Aria Operations (vRealize Operations) monitoring, alerting, and capacity planning"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/vmware-skills/VMware-Aria",
8
8
  "source": "github"
9
9
  },
10
- "version": "2.3.0",
10
+ "version": "2.4.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "pypi",
14
14
  "identifier": "vmware-aria",
15
- "version": "2.3.0",
15
+ "version": "2.4.0",
16
16
  "runtimeHint": "uvx",
17
17
  "packageArguments": [
18
18
  {
@@ -49,7 +49,7 @@ VMware Aria Operations (vRealize Operations 8.x, VCF Operations 9.x) AI-assisted
49
49
  ## Quick Install
50
50
 
51
51
  ```bash
52
- uv tool install vmware-aria==2.3.0
52
+ uv tool install vmware-aria==2.4.0
53
53
  vmware-aria init # guided setup: writes config + .env (chmod 600, password grep-safe), then verifies
54
54
  vmware-aria doctor
55
55
  ```
@@ -306,7 +306,7 @@ Set `VMWARE_ARIA_<TARGET_NAME_UPPER>_PASSWORD` (hyphens become underscores; targ
306
306
 
307
307
  ### `invalid peer certificate: UnknownIssuer` when running uvx (corporate TLS proxy)
308
308
 
309
- `uvx` re-resolves from PyPI on every launch, and a TLS-intercepting proxy breaks that. Run `vmware-aria mcp` after `uv tool install vmware-aria==2.3.0` (no network on launch), or set `UV_NATIVE_TLS=true` to use the system cert store.
309
+ `uvx` re-resolves from PyPI on every launch, and a TLS-intercepting proxy breaks that. Run `vmware-aria mcp` after `uv tool install vmware-aria==2.4.0` (no network on launch), or set `UV_NATIVE_TLS=true` to use the system cert store.
310
310
 
311
311
  ## Audit & Safety
312
312
 
@@ -16,19 +16,19 @@ Complete setup and security guide for `vmware-aria`.
16
16
  ### Via uv (recommended)
17
17
 
18
18
  ```bash
19
- uv tool install vmware-aria==2.3.0
19
+ uv tool install vmware-aria==2.4.0
20
20
  ```
21
21
 
22
22
  ### Via pip
23
23
 
24
24
  ```bash
25
- pip install vmware-aria==2.3.0
25
+ pip install vmware-aria==2.4.0
26
26
  ```
27
27
 
28
28
  ### From source
29
29
 
30
30
  ```bash
31
- git clone --branch v2.3.0 https://github.com/vmware-skills/VMware-Aria.git
31
+ git clone --branch v2.4.0 https://github.com/vmware-skills/VMware-Aria.git
32
32
  cd VMware-Aria
33
33
  pip install -e .
34
34
  ```
@@ -194,7 +194,7 @@ Add to `~/.claude.json` (or use `claude mcp add`):
194
194
 
195
195
  > v1.5.15+ recommends `vmware-aria mcp`. Pre-1.5.15 used the legacy
196
196
  > `vmware-aria-mcp` console script (still kept for backward compatibility).
197
- > If using `uvx --from vmware-aria==2.3.0 vmware-aria mcp` and you hit
197
+ > If using `uvx --from vmware-aria==2.4.0 vmware-aria mcp` and you hit
198
198
  > `invalid peer certificate: UnknownIssuer` behind a corporate TLS proxy,
199
199
  > set `UV_NATIVE_TLS=true` or use the recommended form above.
200
200
 
@@ -253,6 +253,13 @@ vmware-aria mcp --transport https --host 0.0.0.0 --port 8443 \
253
253
  - Behind a reverse proxy that terminates TLS (Nginx, HAProxy) on the same machine, use
254
254
  `--transport http --host 127.0.0.1 --public-name mcp.example.com` (the names the proxy forwards in `Host`), and
255
255
  have the proxy pass the `Authorization` header through.
256
+ - Behind a load balancer or gateway on another machine, keep `--transport https` (a self-signed certificate is
257
+ fine: the balancer is the client that has to trust it), list in `--public-name` the host name the balancer sends
258
+ as `Host`, and have it forward `Authorization`. Point its health probe at `GET /healthz`: it needs no token, returns
259
+ only `{"status": "ok"}` and accepts any `Host` (vmware-policy ≥ 1.23.0). Every other path still needs the token.
260
+ - Correlation: each audit row stores the caller's `traceparent` trace-id, else its `X-Request-ID` /
261
+ `X-Correlation-ID`. Have the agent platform send one, and `vmware-audit log --correlation-id ID` lists the calls
262
+ behind one platform request.
256
263
  - `vmware-audit token list` / `token revoke NAME` manage callers; a revoked token is refused from its next request.
257
264
  Replace a leaked token under a new name.
258
265
  - The server will not start without at least one token, and checks before it binds that unauthenticated requests
@@ -263,6 +270,7 @@ vmware-aria mcp --transport https --host 0.0.0.0 --port 8443 \
263
270
  - **Everyone who can reach the endpoint acts with this server's account.** Tokens identify callers; they grant
264
271
  nothing on the platform. Run one endpoint per privilege level (for example a read-only account behind
265
272
  `--expose read`, and a separate endpoint for operators).
273
+ - **Several people or roles on one endpoint:** run `vmware-audit roles enable` once, then give each token a role (`vmware-audit token create NAME --role reader`, or a role in `roles.yaml` naming tools and targets; vmware-policy ≥ 1.24.0). A role limits what the token may call on this endpoint; it cannot grant more than the account has. See vmware-policy's README, "Roles for network callers".
266
274
 
267
275
  ## Docker Deployment
268
276
 
@@ -0,0 +1,55 @@
1
+ """HLD §18: the role metadata this skill declares matches its real tools."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+
7
+ import pytest
8
+
9
+ from vmware_aria import policy_roles
10
+
11
+
12
+ def _registry() -> set[str]:
13
+ from vmware_aria.mcp_server.server import mcp
14
+
15
+ return {t.name for t in asyncio.run(mcp.list_tools())}
16
+
17
+
18
+ @pytest.mark.unit
19
+ def test_every_declared_name_is_a_real_tool():
20
+ named = set(policy_roles.ESCAPES) | set(getattr(policy_roles, "AKO_TOOLS", ()))
21
+ assert named - _registry() == set(), sorted(named - _registry())
22
+
23
+
24
+ @pytest.mark.unit
25
+ def test_metadata_is_declared_when_policy_has_roles():
26
+ roles = pytest.importorskip("vmware_policy.roles")
27
+ import vmware_aria.mcp_server.server # noqa: F401 (registers the metadata on import)
28
+
29
+ meta = roles.metadata("aria")
30
+ assert meta is not None and meta.version == 1
31
+ assert meta.escapes == policy_roles.ESCAPES
32
+ assert (meta.resolver is not None) is True
33
+
34
+
35
+ @pytest.mark.unit
36
+ def test_the_resolver_uses_the_config_the_connection_manager_holds(monkeypatch):
37
+ """Review H1/H-1: once the server's connection manager exists, a config edit must
38
+ not move the role check off the config it connects with; before, read the file."""
39
+ import importlib
40
+ import types
41
+
42
+ from vmware_aria import policy_roles as pr
43
+
44
+ server = importlib.import_module("vmware_aria.mcp_server._shared")
45
+ assert hasattr(server, "_conn_mgr"), "policy_roles looks up a global the server does not have"
46
+ edited, loads = object(), []
47
+ monkeypatch.setattr(pr, "load_config", lambda: loads.append(1) or edited)
48
+
49
+ monkeypatch.setattr(server, "_conn_mgr", None)
50
+ assert pr._connection_config() is edited and pr._connection_config() is edited
51
+ assert len(loads) == 2 # no manager yet: the file as it is now, every time
52
+
53
+ held = object()
54
+ monkeypatch.setattr(server, "_conn_mgr", types.SimpleNamespace(_config=held))
55
+ assert pr._connection_config() is held # the manager's copy, not the edited file
@@ -1142,7 +1142,7 @@ wheels = [
1142
1142
 
1143
1143
  [[package]]
1144
1144
  name = "vmware-aria"
1145
- version = "2.3.0"
1145
+ version = "2.4.0"
1146
1146
  source = { editable = "." }
1147
1147
  dependencies = [
1148
1148
  { name = "httpx" },
@@ -1181,14 +1181,14 @@ dev = [
1181
1181
 
1182
1182
  [[package]]
1183
1183
  name = "vmware-policy"
1184
- version = "1.22.0"
1184
+ version = "1.24.0"
1185
1185
  source = { registry = "https://pypi.org/simple" }
1186
1186
  dependencies = [
1187
1187
  { name = "pyyaml" },
1188
1188
  { name = "rich" },
1189
1189
  { name = "typer" },
1190
1190
  ]
1191
- sdist = { url = "https://files.pythonhosted.org/packages/d7/52/405a9d5e88d79649f4d7bddade8248f38ab6a508007a7500a3cdcf81897a/vmware_policy-1.22.0.tar.gz", hash = "sha256:e1a96b44ddf3c4d00fb8bdcaae4e1a059b03f343a84df9de23f865122d3dc280", size = 319890, upload-time = "2026-10-15T14:39:45.757Z" }
1191
+ sdist = { url = "https://files.pythonhosted.org/packages/4a/62/3a3cb83af77e3dd3c8fc92cb3b7968bfda04a2f71bf0d6f9b72ee3198441/vmware_policy-1.24.0.tar.gz", hash = "sha256:fba12732ccbd4371232c15d9fd014f9f5d697497210aedff2515d1d205ed3577", size = 361302, upload-time = "2026-10-16T07:18:28.317Z" }
1192
1192
  wheels = [
1193
- { url = "https://files.pythonhosted.org/packages/73/b5/2536cc8750c3ecb0a57c573def664989642ccae1a4f4a8b4283e34877721/vmware_policy-1.22.0-py3-none-any.whl", hash = "sha256:ca8afc5731e926b5eb1b93e26e14763b477bd45c33d3808138fb72903e2af664", size = 108585, upload-time = "2026-10-15T14:39:43.888Z" },
1193
+ { url = "https://files.pythonhosted.org/packages/3d/f2/fe3d9d384712023916e2cacddc385f14b095509c5e00aea417d1a9550e98/vmware_policy-1.24.0-py3-none-any.whl", hash = "sha256:cf615d0256134f01fb84c39b083649281a66d2c064c2eaa28786a0fa95ec6e58", size = 131460, upload-time = "2026-10-16T07:18:26.907Z" },
1194
1194
  ]
@@ -1,3 +1,3 @@
1
1
  """VMware Aria Operations (vRealize Operations) monitoring and capacity planning."""
2
2
 
3
- __version__ = "2.3.0"
3
+ __version__ = "2.4.0"
@@ -38,3 +38,7 @@ def _environment_for(target: str | None) -> str:
38
38
  # to ALLOW. Keyed, a resolver only ever answers for its own skill, so
39
39
  # registering at import time is safe again.
40
40
  set_environment_resolver(_environment_for, skill=skill_name(__name__))
41
+
42
+
43
+ # Role metadata (HLD §18) is declared beside the environment resolver, on every surface.
44
+ import vmware_aria.policy_roles # noqa: F401
@@ -0,0 +1,57 @@
1
+ """What vmware-policy needs to apply roles to this skill (HLD §18 D-21/D-22).
2
+
3
+ Policy cannot see which tools escape a role or how a missing target resolves; this
4
+ module declares them. Imported by ``policy_environment``, so the MCP server and
5
+ the CLI both register it. With a vmware-policy that has no roles module (< 1.24)
6
+ nothing is declared.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import sys
12
+
13
+ from vmware_policy import skill_name
14
+
15
+ from vmware_aria.config import load_config
16
+
17
+ #: Tools that give their holder more than a role. get_api_path reads any indexed API
18
+ #: path, including account and credential listings. Host-path tools are added by policy
19
+ #: while a file root is set.
20
+ ESCAPES = frozenset(
21
+ {
22
+ "get_api_path",
23
+ }
24
+ )
25
+
26
+
27
+ def _connection_config():
28
+ """The config the connection layer uses for this call (review H1, then H-1).
29
+
30
+ The server's connection manager loads the config once, on its first connection,
31
+ and keeps it. Once it exists, the role is checked against that same object, so
32
+ an edit to config.yaml cannot move the check off the target the call connects
33
+ to. Before it exists, the file as it is now is what the manager is about to load.
34
+ Looked up in ``sys.modules`` so the CLI never imports the MCP server.
35
+ """
36
+ server = sys.modules.get("vmware_aria.mcp_server._shared")
37
+ manager = getattr(server, "_conn_mgr", None) if server is not None else None
38
+ return manager._config if manager is not None else load_config()
39
+
40
+
41
+ def _target_name(target: str | None) -> str:
42
+ """The target the connection layer would use for ``target`` (or the default)."""
43
+ config = _connection_config()
44
+ return config.get_target_strict(target or config.default_target or "").name
45
+
46
+
47
+ try:
48
+ from vmware_policy.roles import declare_role_metadata
49
+ except ImportError: # vmware-policy without roles: nothing to declare
50
+ declare_role_metadata = None
51
+
52
+ if declare_role_metadata is not None:
53
+ declare_role_metadata(
54
+ skill_name(__name__),
55
+ escapes=ESCAPES,
56
+ resolver=_target_name,
57
+ )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes