import { ModelId } from './types'; import { OpShape } from '../command/op'; /** * 투영기 입력 — 이력 레코드의 lib-로컬 최소 형태(호스트 `OpHistoryRecord`의 부분집합). * 호스트가 `{diagramId, seq}` 정렬로 조회해 넘긴다. lib는 호스트 타입에 의존하지 않으려 여기서 재선언한다. */ export interface FieldAuditRecord { /** diagram 내 단조 증가 좌표 — 타임라인 정렬 키(갭 허용, 연속성 가정 금지 §5.4). */ seq: number; /** 서버 시각(감사 표시용 패스스루). */ ts?: string | number | Date; /** op 출처(gui/agent/rest). 감사 "누가"의 현 해상도(경로 수준, §4 결정 2). */ origin?: string; /** * 개별 사용자 식별자(감사 "누가"의 per-user 해상도, §4 결정 2-(나)). * 슬라이스 1/3c 레코드에는 없음(forward-only) — 있으면 그대로 타임라인에 패스스루한다(author-aware). */ author?: string; /** 편집 vs 복원 축(감사 표시). */ kind?: 'edit' | 'restore'; /** kind='restore'일 때 복원 대상 seq(패스스루). */ restoredFromSeq?: number; /** ★필드 변경의 원천. edit=배치 그대로 / restore=합성 diff. */ ops: OpShape[]; } /** * 감사 대상 로케이터. 설정된 ref로 대상 종류(엔티티/속성/연산/인덱스/연관/연관end/그룹)가 결정된다. * `field`를 주면 그 필드 단일 타임라인, 생략하면 대상의 모든 변경 필드. */ export interface FieldAuditTarget { entityRef?: ModelId; attributeRef?: ModelId; operationRef?: ModelId; indexRef?: ModelId; associationRef?: ModelId; groupRef?: ModelId; noteRef?: ModelId; end?: 'end1' | 'end2'; /** 단일 필드로 좁힘(생략 시 전 필드). */ field?: string; } /** 타임라인 한 엔트리 — 한 필드가 한 seq에서 얻은 값(또는 tombstone). */ export interface FieldAuditEntry { seq: number; ts?: string | number | Date; origin?: string; author?: string; kind?: 'edit' | 'restore'; restoredFromSeq?: number; /** 바뀐 필드명. 멤버십은 'memberEntityRefs'. */ field: string; /** 신규 값. null=필드 비움(clear). removed=true면 undefined. */ value: unknown; /** 직전 엔트리에서 파생한 이전 값(§3.3-(가)). 최초 born·재-add는 없음. */ oldValue?: unknown; /** 대상/필드가 이 seq에 소멸(remove/entity.remove/group.removeMember). */ removed?: boolean; } /** * op 이력 스트림을 특정 대상의 per-field 변경 타임라인으로 투영한다(순수). * * @param records seq 오름차순 이력 레코드(방어적으로 seq 재정렬). 각 `ops`가 필드 변경 원천. * @param target 대상 로케이터(+ 선택적 field 필터). * @returns seq 순 필드 감사 엔트리 배열(edit·restore 혼합, born·update·tombstone·멤버십). */ export declare function projectFieldAudit(records: readonly FieldAuditRecord[], target: FieldAuditTarget): FieldAuditEntry[];