b01de4be7d
Task 1-3-01: /v1/sandboxes endpoints (create/list/get/snapshot/delete) over the manager
singleton via DI; lifespan boots the startup orphan reaper (a-1) + destroys all on shutdown.
Abuse control (G-5): learner allowlist (403 unknown id), per-learner active cap (429),
global create-rate cap (429). CORS gains DELETE. 174 full-suite tests green; manual probe
POST /v1/sandboxes -> 201 verified live; ruff clean.
---ci---
phase: 1
milestone: v0.3
status: execute
requirements: {covered: [REQ-3-001, REQ-3-002], partial: []}
---/ci---
36 lines
1.0 KiB
Python
36 lines
1.0 KiB
Python
"""FastAPI dependencies — provider, settings, sessions, agents via app.state (DI)."""
|
|
|
|
from fastapi import Request
|
|
|
|
from ..agents.registry import AgentRegistry
|
|
from ..agents.session import SessionStore
|
|
from ..config import Settings
|
|
from ..llm.base import LLMProvider
|
|
from ..sandbox.manager import SandboxManager
|
|
from ..sandbox.workdir import SandboxDir
|
|
|
|
|
|
def get_settings(request: Request) -> Settings:
|
|
return request.app.state.settings
|
|
|
|
|
|
def get_provider(request: Request) -> LLMProvider:
|
|
return request.app.state.provider
|
|
|
|
|
|
def get_session_store(request: Request) -> SessionStore:
|
|
return request.app.state.session_store
|
|
|
|
|
|
def get_agent_registry(request: Request) -> AgentRegistry:
|
|
return request.app.state.agent_registry
|
|
|
|
|
|
def get_sandbox_manager(request: Request) -> SandboxManager:
|
|
return request.app.state.sandbox_manager
|
|
|
|
|
|
def get_sandbox_test_layout(request: Request) -> SandboxDir | None:
|
|
"""Optional test seam (app.state.sandbox_test_layout); always None in prod."""
|
|
return getattr(request.app.state, "sandbox_test_layout", None)
|