Engine honours org policy and monthly budget, legacy runner skips engine tasks, sandbox session provisioned on demand, project fallback for threads, reviewer fallback, tenant checks on project ids, memory reflection respects grants, expiry worker, MCP pipeline_status, login redirect, sharing settings, e2e smoke. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
191 lines
6.4 KiB
Python
191 lines
6.4 KiB
Python
"""Composition root for the application services.
|
|
|
|
This module builds every application service from a single ``AsyncSession``.
|
|
It exists so that the HTTP layer and the standalone workers share **one**
|
|
wiring: if the API and a worker ever disagreed about which adapter backs a
|
|
port, that would be a bug, and having two copies of the wiring is exactly how
|
|
such a bug appears.
|
|
|
|
Deliberately free of FastAPI: the HTTP dependency functions in
|
|
``app.interfaces.http.deps`` delegate here, and so do the workers in
|
|
``app.workers``. Nothing in the inner layers imports this module.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.application.container_delivery import (
|
|
build_delivery_hooks,
|
|
build_delivery_service,
|
|
build_deploy_service,
|
|
build_deploy_target_tester,
|
|
build_repo_workspace,
|
|
)
|
|
from app.application.container_engine import build_scheduler, build_workforce_bootstrap
|
|
from app.application.container_org import (
|
|
build_memory,
|
|
build_memory_service,
|
|
build_model_grant_service,
|
|
build_model_grants,
|
|
)
|
|
from app.application.services.billing_service import BillingService
|
|
from app.application.services.knowledge_service import KnowledgeService
|
|
from app.application.services.project_service import ProjectService
|
|
from app.application.services.sandbox_service import SandboxService
|
|
from app.application.services.workforce_service import WorkforceService
|
|
from app.infrastructure.adapters.registry import (
|
|
get_domain_router,
|
|
get_git_provider,
|
|
get_model_provider,
|
|
get_payment_provider,
|
|
get_sandbox_provider,
|
|
get_vector_store,
|
|
)
|
|
from app.infrastructure.repositories.ai_control import (
|
|
AiModelRepository,
|
|
ModelCredentialRepository,
|
|
RateCardRepository,
|
|
RoutingPolicyRepository,
|
|
)
|
|
from app.infrastructure.repositories.audit import UsageLedgerRepository
|
|
from app.infrastructure.repositories.billing import (
|
|
CreditWalletRepository,
|
|
InvoiceRepository,
|
|
PaymentRepository,
|
|
PlanRepository,
|
|
SubscriptionRepository,
|
|
)
|
|
from app.infrastructure.repositories.knowledge import (
|
|
DocumentChunkRepository,
|
|
DocumentRepository,
|
|
EmbeddingJobRepository,
|
|
KnowledgeSourceRepository,
|
|
RetrievalPolicyRepository,
|
|
)
|
|
from app.infrastructure.repositories.projects import (
|
|
PreviewDomainRepository,
|
|
ProjectGitCredentialRepository,
|
|
ProjectGitRepoRepository,
|
|
ProjectRepository,
|
|
)
|
|
from app.infrastructure.repositories.sandbox import (
|
|
CommandRunRepository,
|
|
PreviewUrlRepository,
|
|
ResourceLimitRepository,
|
|
SandboxSessionRepository,
|
|
SandboxTemplateRepository,
|
|
SnapshotRepository,
|
|
WorkspaceRepository,
|
|
)
|
|
from app.infrastructure.repositories.workforce import (
|
|
AgentTemplateRepository,
|
|
ArtifactRepository,
|
|
EmployeeRepository,
|
|
EmployeeToolPermissionRepository,
|
|
MessageRepository,
|
|
PromptVersionRepository,
|
|
RunRepository,
|
|
RunStepRepository,
|
|
TaskRepository,
|
|
ThreadRepository,
|
|
ToolCallRepository,
|
|
)
|
|
|
|
|
|
def build_project_service(session: AsyncSession) -> ProjectService:
|
|
"""Project + Git repo + preview domain, with the configured adapters."""
|
|
return ProjectService(
|
|
projects=ProjectRepository(session),
|
|
repos=ProjectGitRepoRepository(session),
|
|
credentials=ProjectGitCredentialRepository(session),
|
|
domains=PreviewDomainRepository(session),
|
|
git=get_git_provider(),
|
|
router=get_domain_router(),
|
|
)
|
|
|
|
|
|
def build_workforce_service(session: AsyncSession) -> WorkforceService:
|
|
"""Employees, threads, tasks and the run engine."""
|
|
return WorkforceService(
|
|
employees=EmployeeRepository(session),
|
|
templates=AgentTemplateRepository(session),
|
|
prompts=PromptVersionRepository(session),
|
|
permissions=EmployeeToolPermissionRepository(session),
|
|
threads=ThreadRepository(session),
|
|
messages=MessageRepository(session),
|
|
tasks=TaskRepository(session),
|
|
runs=RunRepository(session),
|
|
run_steps=RunStepRepository(session),
|
|
tool_calls=ToolCallRepository(session),
|
|
artifacts=ArtifactRepository(session),
|
|
models=AiModelRepository(session),
|
|
credentials=ModelCredentialRepository(session),
|
|
routing_policies=RoutingPolicyRepository(session),
|
|
rate_cards=RateCardRepository(session),
|
|
ledger=UsageLedgerRepository(session),
|
|
provider=get_model_provider(),
|
|
)
|
|
|
|
|
|
def build_billing_service(session: AsyncSession) -> BillingService:
|
|
"""Wallets, invoices, payments and the usage ledger."""
|
|
return BillingService(
|
|
wallets=CreditWalletRepository(session),
|
|
invoices=InvoiceRepository(session),
|
|
payments=PaymentRepository(session),
|
|
plans=PlanRepository(session),
|
|
subscriptions=SubscriptionRepository(session),
|
|
ledger=UsageLedgerRepository(session),
|
|
payment_provider=get_payment_provider(),
|
|
)
|
|
|
|
|
|
def build_knowledge_service(session: AsyncSession) -> KnowledgeService:
|
|
"""Knowledge sources, documents, chunks and the vector store."""
|
|
return KnowledgeService(
|
|
sources=KnowledgeSourceRepository(session),
|
|
documents=DocumentRepository(session),
|
|
chunks=DocumentChunkRepository(session),
|
|
jobs=EmbeddingJobRepository(session),
|
|
policies=RetrievalPolicyRepository(session),
|
|
vector_store=get_vector_store(),
|
|
)
|
|
|
|
|
|
def build_sandbox_service(session: AsyncSession) -> SandboxService:
|
|
"""The sandbox gateway: the only sanctioned path for running code."""
|
|
return SandboxService(
|
|
templates=SandboxTemplateRepository(session),
|
|
workspaces=WorkspaceRepository(session),
|
|
sessions=SandboxSessionRepository(session),
|
|
commands=CommandRunRepository(session),
|
|
snapshots=SnapshotRepository(session),
|
|
previews=PreviewUrlRepository(session),
|
|
limits=ResourceLimitRepository(session),
|
|
rate_cards=RateCardRepository(session),
|
|
ledger=UsageLedgerRepository(session),
|
|
projects=ProjectRepository(session),
|
|
provider=get_sandbox_provider(),
|
|
)
|
|
|
|
|
|
__all__ = [
|
|
"build_billing_service",
|
|
"build_delivery_hooks",
|
|
"build_delivery_service",
|
|
"build_deploy_service",
|
|
"build_deploy_target_tester",
|
|
"build_memory",
|
|
"build_memory_service",
|
|
"build_model_grant_service",
|
|
"build_model_grants",
|
|
"build_repo_workspace",
|
|
"build_scheduler",
|
|
"build_workforce_bootstrap",
|
|
"build_knowledge_service",
|
|
"build_project_service",
|
|
"build_sandbox_service",
|
|
"build_workforce_service",
|
|
]
|