feat(#94): implement spoke configuration UI
Implements the final piece of M7-Federation - the spoke configuration UI that allows administrators to configure their local instance's federation capabilities and settings. Backend Changes: - Add UpdateInstanceDto with validation for name, capabilities, and metadata - Implement FederationService.updateInstanceConfiguration() method - Add PATCH /api/v1/federation/instance endpoint to FederationController - Add audit logging for configuration updates - Add tests for updateInstanceConfiguration (5 new tests, all passing) Frontend Changes: - Create SpokeConfigurationForm component with PDA-friendly design - Create /federation/settings page with configuration management - Add regenerate keypair functionality with confirmation dialog - Extend federation API client with updateInstanceConfiguration and regenerateInstanceKeys - Add comprehensive tests (10 tests, all passing) Design Decisions: - Admin-only access via AdminGuard - Never expose private key in API responses (security) - PDA-friendly language throughout (no demanding terms) - Clear visual hierarchy with read-only and editable fields - Truncated public key with copy button for usability - Confirmation dialog for destructive key regeneration All tests passing: - Backend: 13/13 federation service tests passing - Frontend: 10/10 SpokeConfigurationForm tests passing - TypeScript compilation: passing - Linting: passing - PDA-friendliness: verified This completes M7-Federation. All federation features are now implemented. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
46
apps/api/src/federation/dto/instance.dto.ts
Normal file
46
apps/api/src/federation/dto/instance.dto.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Instance Configuration DTOs
|
||||
*
|
||||
* Data Transfer Objects for instance configuration API.
|
||||
*/
|
||||
|
||||
import { IsString, IsBoolean, IsOptional, IsObject, ValidateNested } from "class-validator";
|
||||
import { Type } from "class-transformer";
|
||||
|
||||
/**
|
||||
* DTO for federation capabilities
|
||||
*/
|
||||
export class FederationCapabilitiesDto {
|
||||
@IsBoolean()
|
||||
supportsQuery!: boolean;
|
||||
|
||||
@IsBoolean()
|
||||
supportsCommand!: boolean;
|
||||
|
||||
@IsBoolean()
|
||||
supportsEvent!: boolean;
|
||||
|
||||
@IsBoolean()
|
||||
supportsAgentSpawn!: boolean;
|
||||
|
||||
@IsString()
|
||||
protocolVersion!: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* DTO for updating instance configuration
|
||||
*/
|
||||
export class UpdateInstanceDto {
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
name?: string;
|
||||
|
||||
@IsOptional()
|
||||
@ValidateNested()
|
||||
@Type(() => FederationCapabilitiesDto)
|
||||
capabilities?: FederationCapabilitiesDto;
|
||||
|
||||
@IsOptional()
|
||||
@IsObject()
|
||||
metadata?: Record<string, unknown>;
|
||||
}
|
||||
Reference in New Issue
Block a user