Plan — MT-12: Create TenantResolver service + TenantContext#
Summary#
Create TenantResolverService and TenantContext interface in src/tenant/ that resolves incoming webhooks to a tenant context carrying platform provider, LLM provider, and config references. Single-tenant MVP: all requests resolve to the same ENV-based default context. Wire resolution into WebhookController and attach to DispatchEvent.
Files#
| File | Action | Description |
|---|---|---|
src/tenant/tenant-context.interface.ts | create | TenantContext interface with tenant, repoConfig, platformProvider, llmProvider fields |
src/tenant/tenant-resolver.service.ts | create | TenantResolverService with resolveFromWebhook() and resolveFromRepo() — both return default single-tenant context |
src/tenant/tenant-resolver.service.spec.ts | create | Unit tests: webhook→tenant, repo string→tenant, correct provider instances |
src/tenant/tenant.module.ts | modify | Export TenantResolverService, import PlatformModule, LLMModule, CredentialModule |
src/webhook/dto/dispatch-event.dto.ts | modify | Add optional tenantContext?: TenantContext field to DispatchEvent and DispatchEventParams |
src/webhook/webhook.controller.ts | modify | Inject TenantResolverService, resolve tenant after adapter normalization, attach to DispatchEvent |
Steps#
- Create
src/tenant/tenant-context.interface.ts— defineTenantContextimportingTenantConfig/RepoConfigfrom./tenant-config.interface,PlatformProviderfrom../platform/platform-provider.interface,LLMProviderfrom../llm/llm-provider.interface. - Create
src/tenant/tenant-resolver.service.ts— injectable service that injectsTenantConfigService,PlatformProvider(via injection token),LLMProvider(via injection token). BothresolveFromWebhook(platform, headers, body)andresolveFromRepo(repo)extract org/repo info and return the default ENV-basedTenantContext. No errors thrown for unrecognized orgs/repos. - Update
src/tenant/tenant.module.ts— addTenantResolverServiceto providers/exports, importPlatformModule,LLMModule,CredentialModule. - Extend
DispatchEventinsrc/webhook/dto/dispatch-event.dto.ts— add optionaltenantContext?: TenantContextto bothDispatchEventParamsand theDispatchEventclass, assigned in constructor. - Update
src/webhook/webhook.controller.ts— injectTenantResolverService, callresolveFromWebhook('github', headers, body)afteradapter.normalize(), pass resolved context intoDispatchEventconstructor. - Create
src/tenant/tenant-resolver.service.spec.ts— test webhook payload resolution, repo string resolution, and thatTenantContextcarries correct provider instances.
Verification#
tsc --noEmitpasses with no type errorsnpm run lintpasses (zero warnings)npm run testpasses — new spec covers webhook resolution, repo resolution, provider instance correctness
Risks#
- Wave 2 dependencies (#345, #347, #348) not yet merged —
PlatformProvider,LLMProvider,TenantConfigService,CredentialModuleinterfaces/modules must exist before this can compile. If not merged, implementation must stub or co-create minimal interfaces. - DispatchEvent is a class with readonly fields — adding
tenantContextrequires updating the constructor andDispatchEventParamsinterface; downstream consumers that destructure or serializeDispatchEventmust tolerate the new optional field.