/** * SMI-2269: Quarantine Service with Authentication * SMI-2277: Persist multi-approval state to database * @see SMI-2741: Multi-approval workflow split to QuarantineService.multiapproval.ts * * Service layer for quarantine operations that enforces authentication * and authorization. Wraps QuarantineRepository with security controls. * * VP Engineering Guidance: * - Auth belongs in service/handler layer, not repository * - Repositories should be pure data access * * Security Controls: * - QUA-002: Requires authenticated session for review operations * - Enforces security_reviewer permission for review access * - Multi-approval workflow for MALICIOUS severity * - Audit logs include verified reviewer identity * - Approval state persisted to database (survives restarts) * * @module @skillsmith/core/services/quarantine/QuarantineService */ import type { QuarantineRepository } from '../../repositories/quarantine/index.js'; import type { ApprovalRepository } from '../../repositories/quarantine/ApprovalRepository.js'; import type { AuditLogger } from '../../security/AuditLogger.js'; import type { AuthenticatedSession, AuthenticatedReviewInput, AuthenticatedReviewResult, MultiApprovalStatus } from './types.js'; export { handleMaliciousApproval, buildMultiApprovalStatus, } from './QuarantineService.multiapproval.js'; export { MALICIOUS_APPROVAL_COUNT, MULTI_APPROVAL_TIMEOUT_MS, } from './QuarantineService.multiapproval.js'; /** * Quarantine Service with Authentication * * Provides authenticated access to quarantine operations with: * - Session validation * - Permission checks (security_reviewer role) * - Multi-approval workflow for MALICIOUS severity * - Audit logging with verified identities * - Database-persisted approval state (SMI-2277) * * @example * ```typescript * const service = new QuarantineService(repository, approvalRepository, auditLogger) * * // Review a quarantined skill (requires authentication) * const result = await service.review( * session, * quarantineId, * { reviewStatus: 'approved', reviewNotes: 'Verified safe' } * ) * ``` */ export declare class QuarantineService { private readonly repository; private readonly approvalRepository; private readonly auditLogger; constructor(repository: QuarantineRepository, approvalRepository: ApprovalRepository, auditLogger: AuditLogger); /** * Find a quarantine entry by ID * * @param session - Authenticated session * @param id - Quarantine entry ID * @returns Quarantine entry or null */ findById(session: AuthenticatedSession, id: string): import("../../repositories/quarantine/types.js").QuarantineEntry | null; /** * Find quarantine entries for a skill * * @param session - Authenticated session * @param skillId - Skill ID * @returns Array of quarantine entries */ findBySkillId(session: AuthenticatedSession, skillId: string): import("../../repositories/quarantine/types.js").QuarantineEntry[]; /** * Find all quarantine entries with optional filtering * * @param session - Authenticated session * @param filter - Query filters * @returns Paginated quarantine results */ findAll(session: AuthenticatedSession, filter?: Parameters[0]): import("../../repositories/quarantine/types.js").PaginatedQuarantineResults; /** * Get quarantine statistics * * @param session - Authenticated session * @returns Quarantine statistics */ getStats(session: AuthenticatedSession): import("../../repositories/quarantine/types.js").QuarantineStats; /** * Review a quarantine entry with authentication * * This is the secure replacement for QuarantineRepository.review(). * It enforces: * - Valid authenticated session * - security_reviewer permission (quarantine:review) * - Multi-approval for MALICIOUS severity (quarantine:review_malicious) * - Audit logging with verified reviewer identity * * @param session - Authenticated session (verified by auth layer) * @param quarantineId - Quarantine entry ID to review * @param input - Review decision and notes * @returns Review result with verified reviewer identity * @throws QuarantineServiceError on auth/permission failure */ review(session: AuthenticatedSession, quarantineId: string, input: AuthenticatedReviewInput): AuthenticatedReviewResult; /** * Get pending multi-approval status for a quarantine entry * * @param session - Authenticated session * @param quarantineId - Quarantine entry ID * @returns Multi-approval status or null */ getMultiApprovalStatus(session: AuthenticatedSession, quarantineId: string): MultiApprovalStatus | null; /** * Cancel a pending multi-approval workflow * * @param session - Authenticated session (requires admin) * @param quarantineId - Quarantine entry ID * @returns Whether the cancellation was successful */ cancelMultiApproval(session: AuthenticatedSession, quarantineId: string): boolean; /** * Create a quarantine entry (admin only) * * @param session - Authenticated session * @param input - Quarantine creation input * @returns Created quarantine entry */ create(session: AuthenticatedSession, input: Parameters[0]): import("../../repositories/quarantine/types.js").QuarantineEntry; /** * Delete a quarantine entry (admin only) * * @param session - Authenticated session * @param id - Quarantine entry ID * @returns Whether the entry was deleted */ delete(session: AuthenticatedSession, id: string): boolean; } //# sourceMappingURL=QuarantineService.d.ts.map