/** * SafetyDataAccessor - Factory-level safety wrapper for ALL data accessors. * * This wrapper ensures that ALL data operations are safety-enabled by default. * No code path can bypass safety - this is the architectural guarantee. * * Key features: * - Sequence validation before writes * - Write verification (read-back validation) * - Automatic git checkpointing * - Emergency disable via CLEO_DISABLE_SAFETY env var * * @task T4745 * @epic T4732 */ import type { Session, Task, TaskStatus } from '@cleocode/contracts'; import type { ArchiveFile, DataAccessor, QueryTasksResult, TaskAuditLogQuery, TaskAuditLogRow, TaskFieldUpdates, TaskQueryFilters, TransactionAccessor } from './data-accessor.js'; import type { ArchiveFields } from './db-helpers.js'; /** Safety configuration for the wrapper. */ interface WrapperSafetyConfig { /** Enable all safety checks (default: true) */ enabled: boolean; /** Log safety operations (default: false) */ verbose: boolean; } /** * Safety-enabled DataAccessor wrapper. * * Wraps any DataAccessor implementation and automatically applies * safety checks to all write operations. Read operations pass through. * * This class CANNOT be bypassed - it's the only way to get a DataAccessor * from the factory (unless emergency disable is active). */ export declare class SafetyDataAccessor implements DataAccessor { /** The underlying accessor being wrapped. */ private inner; /** Working directory for operations. */ private cwd?; /** Safety configuration. */ private config; /** * Create a SafetyDataAccessor wrapper. * * @param inner - The DataAccessor to wrap * @param cwd - Working directory for path resolution * @param config - Optional safety configuration overrides */ constructor(inner: DataAccessor, cwd?: string, config?: Partial); /** The storage engine backing this accessor. */ get engine(): 'sqlite'; /** * Log safety operation if verbose mode is enabled. */ private logVerbose; /** * Get safety options for data-safety-central operations. */ private getSafetyOptions; loadArchive(): Promise; loadSessions(): Promise; saveSessions(data: Session[]): Promise; saveArchive(data: ArchiveFile): Promise; appendLog(entry: Record): Promise; upsertSingleTask(task: Task): Promise; archiveSingleTask(taskId: string, fields: ArchiveFields): Promise; removeSingleTask(taskId: string): Promise; loadSingleTask(taskId: string): Promise; addRelation(taskId: string, relatedTo: string, relationType: string, reason?: string): Promise; removeRelation(taskId: string, relatedTo: string, relationType?: string): Promise; getAcRows(taskId: string): Promise; getAcBindings(acIds: readonly string[]): Promise; getMetaValue(key: string): Promise; setMetaValue(key: string, value: unknown): Promise; getSchemaVersion(): Promise; queryTasks(filters: TaskQueryFilters): Promise; queryAuditLog(query: TaskAuditLogQuery): Promise; countTasks(filters?: { status?: TaskStatus | TaskStatus[]; parentId?: string; }): Promise; getChildren(parentId: string): Promise; countChildren(parentId: string): Promise; countActiveChildren(parentId: string): Promise; getAncestorChain(taskId: string): Promise; getSubtree(rootId: string): Promise; getDependents(taskId: string): Promise; getDependencyChain(taskId: string): Promise; taskExists(taskId: string): Promise; loadTasks(taskIds: string[]): Promise; updateTaskFields(taskId: string, fields: TaskFieldUpdates): Promise; getNextPosition(parentId: string | null): Promise; shiftPositions(parentId: string | null, fromPosition: number, delta: number): Promise; transaction(fn: (tx: TransactionAccessor) => Promise): Promise; getActiveSession(): Promise; resolveCurrentSession(): Promise; upsertSingleSession(session: import('@cleocode/contracts').Session): Promise; removeSingleSession(sessionId: string): Promise; listAgentInstances(filters?: { status?: string | string[]; agentType?: string | string[]; }): Promise; getAgentInstance(agentId: string): Promise; claimTask(taskId: string, agentId: string): Promise; unclaimTask(taskId: string): Promise; close(): Promise; } /** * Wrap a DataAccessor with safety. * * This is the internal factory helper that wraps any accessor * with the SafetyDataAccessor wrapper. * * @param accessor - The accessor to wrap * @param cwd - Working directory * @returns SafetyDataAccessor wrapping the input */ export declare function wrapWithSafety(accessor: DataAccessor, cwd?: string): DataAccessor; /** * Check if safety is currently enabled. * * @returns true if safety checks are active */ export declare function isSafetyEnabled(): boolean; /** * Get safety status information. * * @returns Object with safety status details */ export declare function getSafetyStatus(): { enabled: boolean; reason?: string; }; export {}; //# sourceMappingURL=safety-data-accessor.d.ts.map