62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Get,
|
|
Param,
|
|
ParseUUIDPipe,
|
|
Post,
|
|
Query,
|
|
UseGuards,
|
|
} from '@nestjs/common';
|
|
import { AuthGuard } from '../auth/auth.guard.js';
|
|
import { CurrentUser } from '../auth/current-user.decorator.js';
|
|
import { EnrollAgentDto, GetEnrollmentQueryDto } from './enrollment.dto.js';
|
|
import { EnrollmentRepository } from './enrollment.repository.js';
|
|
import { EnrollmentService } from './enrollment.service.js';
|
|
|
|
/**
|
|
* The agent enrollment command family's closed HTTP surface (design
|
|
* docs/plans/2026-08-29-agent-enrollment-command-design.md §3): one command,
|
|
* one query. Authentication failures are the guard's (401); everything else
|
|
* is the repository's closed enum mapped by EnrollmentService.
|
|
*/
|
|
@Controller('api/enrollment')
|
|
@UseGuards(AuthGuard)
|
|
export class EnrollmentController {
|
|
constructor(
|
|
private readonly repository: EnrollmentRepository,
|
|
private readonly service: EnrollmentService,
|
|
) {}
|
|
|
|
/** agent.enroll (§3.1). */
|
|
@Post('agents')
|
|
async enroll(@CurrentUser() user: { id: string }, @Body() dto: EnrollAgentDto) {
|
|
return this.service.unwrap(
|
|
await this.repository.enroll({
|
|
actorId: user.id,
|
|
harness: dto.harness,
|
|
name: dto.name,
|
|
persona: dto.persona ?? null,
|
|
model: dto.model,
|
|
provider: dto.provider,
|
|
credential: dto.credential,
|
|
idempotencyKey: dto.idempotencyKey,
|
|
correlationId: dto.correlationId,
|
|
replayMode: dto.replayMode,
|
|
}),
|
|
);
|
|
}
|
|
|
|
/** agent.enrollment.get (§3.2): owner-or-admin; unauthorized and missing fold to one not_found. */
|
|
@Get('agents/:id')
|
|
async getEnrollment(
|
|
@CurrentUser() user: { id: string },
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Query() query: GetEnrollmentQueryDto,
|
|
) {
|
|
return this.service.unwrap(
|
|
await this.repository.getEnrollment(user.id, id, query.correlationId),
|
|
);
|
|
}
|
|
}
|