Title#
feat: implement #356 — MT-12: Create TenantResolver service + TenantContext
Problem#
No mechanism existed to resolve incoming webhooks to a tenant context carrying platform provider, LLM provider, and config references. This is a Wave 3 foundational piece required for multi-tenant support.
Task / Link#
Closes #356
Changes#
- Add
TenantContextinterface (src/tenant/tenant-context.interface.ts) withtenant,repoConfig,platformProvider, andllmProviderfields - Add
TenantResolverService(src/tenant/tenant-resolver.service.ts) withresolveFromWebhook()andresolveFromRepo()— single-tenant MVP returns ENV-based default context - Update
TenantModuleto importLLMModuleand provide a defaultPlatformProvider - Extend
DispatchEvent/DispatchEventParamswith optionaltenantContext?: TenantContext - Wire
TenantResolverServiceintoWebhookControllerto attach resolved context after adapter normalization - Fix integration/e2e test helpers to provide
TenantResolverServicemock inWebhookControllertest modules
Notes#
- Single-tenant MVP: all requests resolve to the same ENV-based default context; no DB lookup
- Uses the upstream
LLM_PROVIDERSymbol fromllm-provider.interface.ts(Wave 2, #346) rather than defining a local token PlatformModulenot yet available;TenantModuleprovides a hardcoded defaultgithubplatform provider directly- Also carries forward the watchdog spec env-var pinning fix (
STUCK_THRESHOLD_MS/SLOW_THRESHOLD_MS) from local master to unblock pre-commit hook in the worktree environment
Testing#
- Unit tests:
src/tenant/tenant-resolver.service.spec.ts— 5 tests covering webhook resolution, repo resolution, fallback, provider instance correctness, and repoConfig reference equality - Updated
webhook.controller.spec.ts,webhook.e2e.spec.ts, andtest/integration/integration-test.utils.tsto mockTenantResolverService - All 768 tests pass with
npm run test