import { Observable } from '@tanbo/stream';
import { Component, Formats, FormatValue, Registry, Scheduler, Selection, Slot, AbstractSelection } from '@textbus/core';
import { AbstractType, Doc as YDoc, Map as YMap, RelativePosition, Text as YText } from 'yjs';
import { SubModelLoader } from './sub-model-loader';
export interface RelativePositionRecord {
    doc: YDoc;
    position: RelativePosition;
}
export interface CursorPosition {
    anchor: RelativePositionRecord;
    focus: RelativePositionRecord;
}
export interface CollaborateHistorySelectionPosition {
    before: CursorPosition | null;
    after: CursorPosition | null;
}
declare class SlotMap {
    private slotAndYTextMap;
    private yTextAndSlotMap;
    set(key: Slot, value: YText): void;
    set(key: YText, value: Slot): void;
    get(key: Slot): YText | null;
    get(key: YText): Slot | null;
    delete(key: Slot | YText): void;
}
export interface SubModelLoaded {
    yType: AbstractType<any>;
    yDoc: YDoc;
}
export declare class Collaborate {
    private scheduler;
    private registry;
    private selection;
    private subModelLoader;
    yDoc: YDoc;
    slotMap: SlotMap;
    onAddSubModel: Observable<SubModelLoaded>;
    private subscriptions;
    private updateFromRemote;
    private addSubModelEvent;
    private updateRemoteActions;
    private noRecord;
    constructor(scheduler: Scheduler, registry: Registry, selection: Selection, subModelLoader: SubModelLoader);
    syncRootComponent(yDoc: YDoc, sharedComponent: YMap<any>, localComponent: Component<any>): void;
    syncRootSlot(yDoc: YDoc, sharedSlot: YText, localSlot: Slot): void;
    getAbstractSelection(position: CursorPosition): AbstractSelection | null;
    getRelativeCursorLocation(): CursorPosition | null;
    restoreCursorPosition(position: CursorPosition | null): void;
    private initSyncEvent;
    private syncComponent;
    private syncSlot;
    destroy(): void;
    private syncSharedMapToLocalMap;
    private createLocalMapBySharedMap;
    private createLocalArrayBySharedArray;
    private syncLocalMapToSharedMap;
    private createSharedMapByLocalMap;
    private createSharedArrayByLocalArray;
    private createSharedSlotByLocalSlot;
    private initSharedSlotByLocalSlot;
    private createLocalSlotBySharedSlot;
    private initLocalSlotBySharedSlot;
    private createSharedModelByLocalModel;
    private createLocalModelBySharedByModel;
    private createSharedComponentByLocalComponent;
    private createLocalComponentBySharedComponent;
    private createArrayHoleXmlElement;
    private isArrayHoleElement;
    /**
     * 仅用于 YArray ↔ 可观察数组：本地 `undefined` 槽位用 XmlElement 占位同步到 Yjs（不与对象字面量同步混用）。
     */
    private sharedModelForArraySlot;
    /**
     * 在可观察数组中插入稀疏空洞（与 YArray 中 XmlElement 占位对齐）。
     * 仅在远端同步路径调用；先改 raw，再用与 {@link ArrayProxyHandler} `length` 增长一致的原子命令
     * `retain` + `insert`（`undefined` 槽）记录，`unApply` 为 `retain` + `delete`。
     * `runLocalUpdate` 在 `updateFromRemote` 为 true 时会跳过，不会把洞再写回 Y。
     */
    private insertSparseHole;
    /** 与 Y 洞位对齐的稀疏洞写入，仅操作 raw */
    private applySparseHoleToRaw;
    /**
     * 双向同步数组
     * @param sharedArray
     * @param localArray
     * @private
     */
    private syncArray;
    /**
     * 双向同步对象
     * @param sharedObject
     * @param localObject
     * @private
     */
    private syncObject;
    private runLocalUpdate;
    private runRemoteUpdate;
}
export declare function localFormatsToYjsAttributes(registry: Registry, slot: Slot, start: number, end: number, localFormats: Record<string, FormatValue>): Record<string, FormatValue | FormatValue[] | null>;
export declare function localFormatsRecordToRemote(registry: Registry, formats: Record<string, FormatValue> | undefined): Record<string, FormatValue | FormatValue[] | null> | undefined;
export declare function formatsArrayToRemoteRecord(registry: Registry, formats: Formats): Record<string, FormatValue | FormatValue[]> | undefined;
/** 远程插入内容的格式 → 本地 Formats（新内容无旧状态，可堆叠仅展开远程数组） */
export declare function remoteInsertFormatsToLocal(registry: Registry, attrs?: Record<string, FormatValue | FormatValue[] | null> | null): Formats;
/** 远程 retain 格式 → 本地 Formats（可堆叠与区间内本地快照做差量对齐） */
export declare function remoteRetainFormatsToLocal(registry: Registry, slot: Slot, start: number, end: number, attrs?: Record<string, FormatValue | FormatValue[] | null> | null): Formats;
export {};
