AI Agents SDE Task Viewer
      • Context
      • Plan
      • Prd
  1. Home
  2. AgentSDE
  3. agent-core
  4. gh-356
  5. plan
  6. plan.md
plan.md(3.5 KB)· Apr 8, 2026· 2 min read
  • Summary
  • Files
  • Steps
  • Verification
  • Risks

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#

FileActionDescription
src/tenant/tenant-context.interface.tscreateTenantContext interface with tenant, repoConfig, platformProvider, llmProvider fields
src/tenant/tenant-resolver.service.tscreateTenantResolverService with resolveFromWebhook() and resolveFromRepo() — both return default single-tenant context
src/tenant/tenant-resolver.service.spec.tscreateUnit tests: webhook→tenant, repo string→tenant, correct provider instances
src/tenant/tenant.module.tsmodifyExport TenantResolverService, import PlatformModule, LLMModule, CredentialModule
src/webhook/dto/dispatch-event.dto.tsmodifyAdd optional tenantContext?: TenantContext field to DispatchEvent and DispatchEventParams
src/webhook/webhook.controller.tsmodifyInject TenantResolverService, resolve tenant after adapter normalization, attach to DispatchEvent

Steps#

  1. Create src/tenant/tenant-context.interface.ts — define TenantContext importing TenantConfig/RepoConfig from ./tenant-config.interface, PlatformProvider from ../platform/platform-provider.interface, LLMProvider from ../llm/llm-provider.interface.
  2. Create src/tenant/tenant-resolver.service.ts — injectable service that injects TenantConfigService, PlatformProvider (via injection token), LLMProvider (via injection token). Both resolveFromWebhook(platform, headers, body) and resolveFromRepo(repo) extract org/repo info and return the default ENV-based TenantContext. No errors thrown for unrecognized orgs/repos.
  3. Update src/tenant/tenant.module.ts — add TenantResolverService to providers/exports, import PlatformModule, LLMModule, CredentialModule.
  4. Extend DispatchEvent in src/webhook/dto/dispatch-event.dto.ts — add optional tenantContext?: TenantContext to both DispatchEventParams and the DispatchEvent class, assigned in constructor.
  5. Update src/webhook/webhook.controller.ts — inject TenantResolverService, call resolveFromWebhook('github', headers, body) after adapter.normalize(), pass resolved context into DispatchEvent constructor.
  6. Create src/tenant/tenant-resolver.service.spec.ts — test webhook payload resolution, repo string resolution, and that TenantContext carries correct provider instances.

Verification#

  • tsc --noEmit passes with no type errors
  • npm run lint passes (zero warnings)
  • npm run test passes — new spec covers webhook resolution, repo resolution, provider instance correctness

Risks#

  • Wave 2 dependencies (#345, #347, #348) not yet merged — PlatformProvider, LLMProvider, TenantConfigService, CredentialModule interfaces/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 tenantContext requires updating the constructor and DispatchEventParams interface; downstream consumers that destructure or serialize DispatchEvent must tolerate the new optional field.
ContextPrd