Files
mjalmoudy94andClaude Sonnet 5.5 fef5a9deab feat(integration): wire v2 workstreams together (engine policy/budget, sandbox, tenant checks, order route, docs)
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>
2026-10-14 20:57:56 +03:30

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",
]