/** * Collaboration Domain Types * Defines real-time collaboration, presence, and operational transform */ import type { JSONValue, Timestamp, UUID } from './common'; /** * User presence in a document (who's viewing/editing) */ export interface Presence { userId: UUID; userName: string; userAvatar?: string; documentId: UUID; status: 'viewing' | 'editing' | 'idle'; cursorPosition?: CursorPosition; selection?: SelectionRange; lastActivity: Timestamp; sessionId: UUID; } /** * Cursor position in document */ export interface CursorPosition { line: number; column: number; offset: number; } /** * Text selection range */ export interface SelectionRange { start: CursorPosition; end: CursorPosition; } /** * Change operation for operational transform */ export interface Change { id: UUID; userId: UUID; documentId: UUID; type: ChangeType; path: string; value?: JSONValue; oldValue?: JSONValue; timestamp: Timestamp; revision: number; parentRevision: number; isLocalOnly?: boolean; } /** * Type of change in document */ export type ChangeType = 'insert' | 'delete' | 'update' | 'replace' | 'move' | 'format' | 'metadata' | 'comment'; /** * Operational Transform operation */ export interface Operation { id: UUID; type: 'insert' | 'delete'; position: number; content?: string; length?: number; userId: UUID; timestamp: Timestamp; revision: number; } /** * Revision in document history */ export interface Revision { id: UUID; documentId: UUID; revision: number; parentRevision: number; userId: UUID; changes: Change[]; timestamp: Timestamp; summary?: string; snapshot?: DocumentSnapshot; } /** * Snapshot of document at a point in time (for efficiency) */ export interface DocumentSnapshot { id: UUID; documentId: UUID; revision: number; content: unknown; timestamp: Timestamp; size: number; } /** * Collaboration session between users */ export interface CollaborationSession { id: UUID; documentId: UUID; userId: UUID; joinedAt: Timestamp; leftAt?: Timestamp; lastHeartbeat: Timestamp; isActive: boolean; clientVersion: string; } /** * Conflict resolution strategy */ export type ConflictResolution = 'ours' | 'theirs' | 'merge' | 'manual'; /** * Conflict that occurred during merge */ export interface Conflict { id: UUID; documentId: UUID; revision: number; change1: Change; change2: Change; type: 'insert-insert' | 'insert-delete' | 'delete-delete' | 'update-update'; resolvedBy?: UUID; resolution?: ConflictResolution; resolvedAt?: Timestamp; } /** * Comment on document content */ export interface DocumentComment { id: UUID; documentId: UUID; userId: UUID; userName: string; userAvatar?: string; content: string; position?: string; range?: SelectionRange; createdAt: Timestamp; updatedAt: Timestamp; resolved: boolean; resolvedAt?: Timestamp; resolvedBy?: UUID; replies: CommentReply[]; tags: string[]; } /** * Reply to a comment */ export interface CommentReply { id: UUID; commentId: UUID; userId: UUID; userName: string; userAvatar?: string; content: string; createdAt: Timestamp; updatedAt: Timestamp; mentionedUsers?: UUID[]; } /** * Suggestion/change proposal in document */ export interface Suggestion { id: UUID; documentId: UUID; userId: UUID; userName: string; type: 'insert' | 'delete' | 'update' | 'format'; content?: JSONValue; oldContent?: JSONValue; path: string; createdAt: Timestamp; accepted: boolean; acceptedBy?: UUID; acceptedAt?: Timestamp; rejected: boolean; rejectedBy?: UUID; rejectedAt?: Timestamp; rejectionReason?: string; } /** * Activity/event in document */ export interface Activity { id: UUID; documentId: UUID; userId: UUID; type: ActivityType; metadata?: Record; timestamp: Timestamp; } /** * Type of activity */ export type ActivityType = 'document_created' | 'document_updated' | 'user_joined' | 'user_left' | 'comment_added' | 'comment_resolved' | 'suggestion_made' | 'suggestion_accepted' | 'suggestion_rejected' | 'permission_changed' | 'document_shared' | 'document_exported'; /** * Notification for collaboration activity */ export interface CollaborationNotification { id: UUID; userId: UUID; type: NotificationType; sourceUserId: UUID; documentId: UUID; content: string; read: boolean; createdAt: Timestamp; readAt?: Timestamp; actionUrl?: string; } /** * Type of collaboration notification */ export type NotificationType = 'comment_mentioned' | 'comment_replied' | 'comment_resolved' | 'suggestion_made' | 'suggestion_accepted' | 'suggestion_rejected' | 'user_joined' | 'permission_changed' | 'document_shared' | 'document_exported'; /** * Merge result when combining two revisions */ export interface MergeResult { success: boolean; mergedRevision?: Revision; conflicts: Conflict[]; resolution?: ConflictResolution; } /** * Operational Transform engine state */ export interface OTEngineState { documentId: UUID; currentRevision: number; pendingOperations: Operation[]; acknowledgements: Map; history: Revision[]; lastSnapshot?: DocumentSnapshot; } /** * Type guard to check if change is insert */ export declare function isInsert(change: Change): boolean; /** * Type guard to check if change is delete */ export declare function isDelete(change: Change): boolean; /** * Type guard to check if conflict is resolved */ export declare function isConflictResolved(conflict: Conflict): boolean; /** * Transform two concurrent operations * Used in Operational Transform algorithm */ export declare function transformOperations(op1: Operation, op2: Operation): [Operation, Operation]; //# sourceMappingURL=collaboration.d.ts.map