agent_hypervisor 3.2.2__tar.gz → 3.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 (117) hide show
  1. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/.gitignore +11 -1
  2. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/PKG-INFO +3 -3
  3. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/README.md +2 -2
  4. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/dashboard/requirements.txt +1 -1
  5. agent_hypervisor-3.4.0/examples/requirements.txt +1 -0
  6. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/pyproject.toml +1 -1
  7. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/api/server.py +29 -1
  8. agent_hypervisor-3.2.2/examples/requirements.txt +0 -1
  9. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/CHANGELOG.md +0 -0
  10. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/LICENSE +0 -0
  11. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/SECURITY.md +0 -0
  12. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/benchmarks/bench_hypervisor.py +0 -0
  13. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/benchmarks/results/BENCHMARKS.md +0 -0
  14. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/benchmarks/results/benchmarks.json +0 -0
  15. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/docs/api-reference.md +0 -0
  16. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/docs/joint-liability-guide.md +0 -0
  17. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/dashboard/README.md +0 -0
  18. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/dashboard/app.py +0 -0
  19. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/demo.py +0 -0
  20. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/docker-compose/Dockerfile +0 -0
  21. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/docker-compose/README.md +0 -0
  22. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/docker-compose/app/__init__.py +0 -0
  23. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/docker-compose/app/dashboard.py +0 -0
  24. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/docker-compose/app/sample_workflow.py +0 -0
  25. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/docker-compose/app/server.py +0 -0
  26. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/docker-compose/config/hypervisor.yaml +0 -0
  27. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/examples/docker-compose/docker-compose.yml +0 -0
  28. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/notebooks/README.md +0 -0
  29. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/notebooks/hypervisor-exploration.ipynb +0 -0
  30. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/__init__.py +0 -0
  31. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/api/__init__.py +0 -0
  32. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/api/models.py +0 -0
  33. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/audit/__init__.py +0 -0
  34. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/audit/commitment.py +0 -0
  35. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/audit/delta.py +0 -0
  36. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/audit/gc.py +0 -0
  37. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/cli/__init__.py +0 -0
  38. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/cli/formatters.py +0 -0
  39. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/cli/session_commands.py +0 -0
  40. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/constants.py +0 -0
  41. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/core.py +0 -0
  42. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/integrations/__init__.py +0 -0
  43. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/integrations/iatp_adapter.py +0 -0
  44. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/integrations/nexus_adapter.py +0 -0
  45. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/integrations/verification_adapter.py +0 -0
  46. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/liability/__init__.py +0 -0
  47. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/liability/attribution.py +0 -0
  48. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/liability/ledger.py +0 -0
  49. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/liability/quarantine.py +0 -0
  50. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/liability/slashing.py +0 -0
  51. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/liability/vouching.py +0 -0
  52. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/models.py +0 -0
  53. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/observability/__init__.py +0 -0
  54. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/observability/causal_trace.py +0 -0
  55. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/observability/event_bus.py +0 -0
  56. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/observability/prometheus_collector.py +0 -0
  57. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/observability/saga_span_exporter.py +0 -0
  58. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/providers.py +0 -0
  59. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/py.typed +0 -0
  60. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/reversibility/__init__.py +0 -0
  61. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/reversibility/registry.py +0 -0
  62. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/rings/__init__.py +0 -0
  63. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/rings/breach_detector.py +0 -0
  64. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/rings/classifier.py +0 -0
  65. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/rings/elevation.py +0 -0
  66. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/rings/enforcer.py +0 -0
  67. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/saga/__init__.py +0 -0
  68. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/saga/checkpoint.py +0 -0
  69. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/saga/dsl.py +0 -0
  70. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/saga/fan_out.py +0 -0
  71. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/saga/orchestrator.py +0 -0
  72. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/saga/schema.py +0 -0
  73. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/saga/state_machine.py +0 -0
  74. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/security/__init__.py +0 -0
  75. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/security/kill_switch.py +0 -0
  76. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/security/rate_limiter.py +0 -0
  77. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/session/__init__.py +0 -0
  78. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/session/intent_locks.py +0 -0
  79. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/session/isolation.py +0 -0
  80. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/session/sso.py +0 -0
  81. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/session/vector_clock.py +0 -0
  82. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/verification/__init__.py +0 -0
  83. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/src/hypervisor/verification/history.py +0 -0
  84. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/__init__.py +0 -0
  85. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/integration/__init__.py +0 -0
  86. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/integration/test_hypervisor_e2e.py +0 -0
  87. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/integration/test_scenarios.py +0 -0
  88. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/test_agent_manager.py +0 -0
  89. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/test_breach_detector.py +0 -0
  90. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/test_classifier.py +0 -0
  91. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/test_kill_switch.py +0 -0
  92. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/test_rate_limiter.py +0 -0
  93. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/test_shapley_attribution.py +0 -0
  94. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/__init__.py +0 -0
  95. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_audit.py +0 -0
  96. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_cli.py +0 -0
  97. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_config_validation.py +0 -0
  98. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_liability.py +0 -0
  99. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_liability_improvements.py +0 -0
  100. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_models.py +0 -0
  101. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_observability.py +0 -0
  102. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_prometheus_collector.py +0 -0
  103. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_reversibility_registry.py +0 -0
  104. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_ring_improvements.py +0 -0
  105. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_rings.py +0 -0
  106. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_saga.py +0 -0
  107. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_saga_improvements.py +0 -0
  108. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_saga_schema.py +0 -0
  109. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_saga_span_exporter.py +0 -0
  110. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_session.py +0 -0
  111. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_session_security.py +0 -0
  112. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_slashing.py +0 -0
  113. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tests/unit/test_vfs_substrate.py +0 -0
  114. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tutorials/execution-rings-workflow/README.md +0 -0
  115. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tutorials/execution-rings-workflow/demo.py +0 -0
  116. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tutorials/saga-compensation/README.md +0 -0
  117. {agent_hypervisor-3.2.2 → agent_hypervisor-3.4.0}/tutorials/saga-compensation/demo.py +0 -0
@@ -246,7 +246,7 @@ PublishScripts/
246
246
  # NuGet Symbol Packages
247
247
  *.snupkg
248
248
  # The packages folder can be ignored because of Package Restore
249
- # DISABLED: mono-repo uses /packages/ for source code
249
+ # DISABLED: mono-repo; source code starts at repo root
250
250
  # **/[Pp]ackages/*
251
251
  # !**/[Pp]ackages/build/
252
252
  # #!**/[Pp]ackages/repositories.config
@@ -455,3 +455,13 @@ FodyWeavers.xsd
455
455
  .env
456
456
  .env.*
457
457
  _site/
458
+
459
+ # Build artifacts and caches
460
+ dist/
461
+ .hypothesis/
462
+ .pytest_cache/
463
+ .ruff_cache/
464
+ _site/
465
+
466
+ # Code Security Assessment artifacts
467
+ .security-assessment/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent_hypervisor
3
- Version: 3.2.2
3
+ Version: 3.4.0
4
4
  Summary: Public Preview — Agent Hypervisor: Runtime supervisor for multi-agent Shared Sessions with Execution Rings, Joint Liability, Saga Orchestration, and hash-chained audit trails
5
5
  Project-URL: Homepage, https://github.com/microsoft/agent-governance-toolkit
6
6
  Project-URL: Repository, https://github.com/microsoft/agent-governance-toolkit
@@ -61,7 +61,7 @@ Description-Content-Type: text/markdown
61
61
  [![CI](https://github.com/microsoft/agent-governance-toolkit/actions/workflows/ci.yml/badge.svg)](https://github.com/microsoft/agent-governance-toolkit/actions/workflows/ci.yml)
62
62
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](../../LICENSE)
63
63
  [![Python](https://img.shields.io/badge/python-3.11+-blue.svg)](https://python.org)
64
- [![PyPI](https://img.shields.io/pypi/v/agent-hypervisor)](https://pypi.org/project/agent-hypervisor/)
64
+ [![PyPI](https://img.shields.io/pypi/v/agent-hypervisor)](https://pypi.org/project/agent-governance-python/agent-hypervisor/)
65
65
  [![Benchmark](https://img.shields.io/badge/latency-268%CE%BCs%20pipeline-orange)](benchmarks/)
66
66
  [![Discussions](https://img.shields.io/github/discussions/microsoft/agent-governance-toolkit)](https://github.com/microsoft/agent-governance-toolkit/discussions)
67
67
 
@@ -85,7 +85,7 @@ Description-Content-Type: text/markdown
85
85
  <a href="https://github.com/langgenius/dify-plugins/pull/2060"><img src="https://img.shields.io/badge/Dify-65K_%E2%AD%90_Merged-success?style=flat-square" alt="Dify"></a>
86
86
  <a href="https://github.com/run-llama/llama_index/pull/20644"><img src="https://img.shields.io/badge/LlamaIndex-47K_%E2%AD%90_Merged-success?style=flat-square" alt="LlamaIndex"></a>
87
87
  <a href="https://github.com/github/awesome-copilot/pull/755"><img src="https://img.shields.io/badge/Awesome_Copilot-Merged-success?style=flat-square" alt="Awesome Copilot"></a>
88
- <a href="https://github.com/microsoft/agent-lightning/pull/478"><img src="https://img.shields.io/badge/Agent--Lightning-15K_%E2%AD%90_Merged-success?style=flat-square" alt="Agent-Lightning"></a>
88
+ <a href="https://github.com/microsoft/agent-governance-python/agent-lightning/pull/478"><img src="https://img.shields.io/badge/Agent--Lightning-15K_%E2%AD%90_Merged-success?style=flat-square" alt="Agent-Lightning"></a>
89
89
  <a href="https://github.com/magsther/awesome-opentelemetry/pull/24"><img src="https://img.shields.io/badge/awesome--opentelemetry-listed-orange?style=flat-square" alt="awesome-opentelemetry"></a>
90
90
  </p>
91
91
 
@@ -9,7 +9,7 @@
9
9
  [![CI](https://github.com/microsoft/agent-governance-toolkit/actions/workflows/ci.yml/badge.svg)](https://github.com/microsoft/agent-governance-toolkit/actions/workflows/ci.yml)
10
10
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](../../LICENSE)
11
11
  [![Python](https://img.shields.io/badge/python-3.11+-blue.svg)](https://python.org)
12
- [![PyPI](https://img.shields.io/pypi/v/agent-hypervisor)](https://pypi.org/project/agent-hypervisor/)
12
+ [![PyPI](https://img.shields.io/pypi/v/agent-hypervisor)](https://pypi.org/project/agent-governance-python/agent-hypervisor/)
13
13
  [![Benchmark](https://img.shields.io/badge/latency-268%CE%BCs%20pipeline-orange)](benchmarks/)
14
14
  [![Discussions](https://img.shields.io/github/discussions/microsoft/agent-governance-toolkit)](https://github.com/microsoft/agent-governance-toolkit/discussions)
15
15
 
@@ -33,7 +33,7 @@
33
33
  <a href="https://github.com/langgenius/dify-plugins/pull/2060"><img src="https://img.shields.io/badge/Dify-65K_%E2%AD%90_Merged-success?style=flat-square" alt="Dify"></a>
34
34
  <a href="https://github.com/run-llama/llama_index/pull/20644"><img src="https://img.shields.io/badge/LlamaIndex-47K_%E2%AD%90_Merged-success?style=flat-square" alt="LlamaIndex"></a>
35
35
  <a href="https://github.com/github/awesome-copilot/pull/755"><img src="https://img.shields.io/badge/Awesome_Copilot-Merged-success?style=flat-square" alt="Awesome Copilot"></a>
36
- <a href="https://github.com/microsoft/agent-lightning/pull/478"><img src="https://img.shields.io/badge/Agent--Lightning-15K_%E2%AD%90_Merged-success?style=flat-square" alt="Agent-Lightning"></a>
36
+ <a href="https://github.com/microsoft/agent-governance-python/agent-lightning/pull/478"><img src="https://img.shields.io/badge/Agent--Lightning-15K_%E2%AD%90_Merged-success?style=flat-square" alt="Agent-Lightning"></a>
37
37
  <a href="https://github.com/magsther/awesome-opentelemetry/pull/24"><img src="https://img.shields.io/badge/awesome--opentelemetry-listed-orange?style=flat-square" alt="awesome-opentelemetry"></a>
38
38
  </p>
39
39
 
@@ -1,4 +1,4 @@
1
- streamlit>=1.37.0
1
+ streamlit>=1.54.0
2
2
  plotly>=5.18.0
3
3
  networkx>=3.2
4
4
  pandas>=2.0.0
@@ -0,0 +1 @@
1
+ agent-hypervisor>=3.2.2
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "agent_hypervisor"
7
- version = "3.2.2"
7
+ version = "3.4.0"
8
8
  description = "Public Preview — Agent Hypervisor: Runtime supervisor for multi-agent Shared Sessions with Execution Rings, Joint Liability, Saga Orchestration, and hash-chained audit trails"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -58,6 +58,34 @@ from hypervisor.observability.event_bus import EventType, HypervisorEventBus
58
58
 
59
59
  logger = logging.getLogger(__name__)
60
60
 
61
+
62
+ def _parse_cors_origins(raw: str) -> list[str]:
63
+ """Parse, validate, and return CORS origins.
64
+
65
+ Rejects ``*`` when credentials are enabled, and validates that each
66
+ origin has a scheme and a non-empty hostname.
67
+ """
68
+ origins: list[str] = []
69
+ for origin in raw.split(","):
70
+ origin = origin.strip()
71
+ if not origin:
72
+ continue
73
+ if origin == "*":
74
+ logger.warning(
75
+ "CORS origin '*' is not allowed with allow_credentials=True — skipping"
76
+ )
77
+ continue
78
+ from urllib.parse import urlparse
79
+ parsed = urlparse(origin)
80
+ if not parsed.scheme or not parsed.hostname:
81
+ logger.warning("Invalid CORS origin (missing scheme or host): %s — skipping", origin)
82
+ continue
83
+ origins.append(origin)
84
+ if not origins:
85
+ logger.warning("No valid CORS origins configured — falling back to localhost defaults")
86
+ origins = ["http://localhost:3000", "http://localhost:8080"]
87
+ return origins
88
+
61
89
  # ── Global state ────────────────────────────────────────────────────────────
62
90
 
63
91
  _hypervisor: Hypervisor | None = None
@@ -127,7 +155,7 @@ def create_app() -> FastAPI:
127
155
 
128
156
  application.add_middleware(
129
157
  CORSMiddleware,
130
- allow_origins=os.environ.get("CORS_ALLOWED_ORIGINS", "http://localhost:3000,http://localhost:8080").split(","),
158
+ allow_origins=_parse_cors_origins(os.environ.get("CORS_ALLOWED_ORIGINS", "http://localhost:3000,http://localhost:8080")),
131
159
  allow_credentials=True,
132
160
  allow_methods=["*"],
133
161
  allow_headers=["*"],
@@ -1 +0,0 @@
1
- agent-hypervisor>=3.2.0