import { Module } from '@nestjs/common'; import { HarnessRegistry } from './harness.registry.js'; import { HarnessService } from './harness.service.js'; import { HARNESS_CONVERSATION_SERVICE, HARNESS_CONVERSATION_SERVICE_UNAVAILABLE, HARNESS_REGISTRY, HARNESS_SERVICE, } from './harness.tokens.js'; import { HarnessController } from './harness.controller.js'; import { HarnessSelectionController } from './harness-selection.controller.js'; import { HarnessSelectionService } from './harness-selection.service.js'; import { HarnessSelectionRepository } from './harness-selection.repository.js'; /** * Wires the harness-neutral registry/service (Task Two) together with the * Slice-Zero catalog and selection HTTP surfaces (Task Three). * * The registry is provided empty here; real harness adapters are registered in a * later task. Because the controllers/services resolve their collaborators through * this real module graph, an unresolved provider fails loudly at `app.init()`. */ @Module({ controllers: [HarnessController, HarnessSelectionController], providers: [ { provide: HARNESS_REGISTRY, useFactory: () => new HarnessRegistry() }, { provide: HARNESS_SERVICE, useClass: HarnessService }, // Task Five: bind the conversation-service token to its explicit "not yet bound" // sentinel. The pi-rpc router treats this as a hard, typed startup failure; Task 14 // replaces it with a real service. Exported so ChatModule's router can inject it. { provide: HARNESS_CONVERSATION_SERVICE, useValue: HARNESS_CONVERSATION_SERVICE_UNAVAILABLE }, HarnessSelectionRepository, HarnessSelectionService, ], exports: [HARNESS_REGISTRY, HARNESS_SERVICE, HARNESS_CONVERSATION_SERVICE], }) export class HarnessModule {}