import type { StatePatch } from './patches.js'; export type Awaitable = T | Promise; export type Equality = (left: T, right: T) => boolean; export type Recipe = (draft: State) => void; export type Stop = () => void; export type NotificationPriority = 'immediate' | 'interactive' | 'background'; export interface CommandContext { readonly signal: AbortSignal; readonly commandId: string; readonly actor?: string; readonly tags: Readonly>; read(): Readonly; edit(recipe: Recipe): void; } export type CommandHandler = (context: CommandContext, payload: Payload) => Awaitable; export type CommandCatalog = Record>; export type PayloadOf = Handler extends CommandHandler ? Payload : never; export type ResultOf = Handler extends CommandHandler ? Awaited : never; export interface RunMeta { actor?: string; tags?: Readonly>; signal?: AbortSignal; priority?: NotificationPriority; deadlineMs?: number; idempotencyKey?: string; } export interface DomainEvent { readonly revision: number; readonly command: string; readonly commandId: string; readonly actor?: string; readonly tags: Readonly>; readonly startedAt: number; readonly finishedAt: number; readonly previous: Readonly; readonly current: Readonly; readonly patches: readonly StatePatch[]; } export interface AuditEntry { readonly revision: number; readonly command: string; readonly commandId: string; readonly actor?: string; readonly startedAt: number; readonly finishedAt: number; readonly durationMs: number; readonly status: 'committed' | 'rejected'; readonly message?: string; readonly tags: Readonly>; readonly patchCount: number; readonly previousHash: string; readonly hash: string; } export interface CommandEnvelope { readonly name: string; readonly payload: unknown; readonly commandId: string; readonly actor?: string; readonly tags: Readonly>; readonly startedAt: number; } export interface DomainModule { before?(envelope: CommandEnvelope, state: Readonly): Awaitable; after?(entry: AuditEntry, state: Readonly): Awaitable; fault?(entry: AuditEntry, error: unknown, state: Readonly): Awaitable; } export interface PolicyInput { readonly command: string; readonly payload: unknown; readonly actor?: string; readonly tags: Readonly>; readonly state: Readonly; } export type AccessPolicy = (input: PolicyInput) => Awaitable; export interface DomainOptions> { readonly name: string; readonly seed: State | (() => State); readonly commands: Commands; readonly modules?: readonly DomainModule[]; readonly policy?: AccessPolicy; readonly invariants?: readonly ((state: Readonly) => void)[]; readonly historyLimit?: number; readonly auditLimit?: number; readonly clone?: (state: State) => State; readonly freeze?: boolean; readonly clock?: () => number; readonly identify?: () => string; readonly validate?: (state: unknown) => state is State; readonly onModuleFault?: (error: unknown, entry: AuditEntry) => void; readonly scheduleNotification?: (notify: () => void, priority: NotificationPriority) => void; readonly idempotencyLimit?: number; } export interface Checkpoint { readonly domain: string; readonly revision: number; readonly createdAt: number; readonly state: State; } export interface CommandPreview { readonly ok: boolean; readonly command: string; readonly commandId: string; readonly actor?: string; readonly tags: Readonly>; readonly revision: number; readonly startedAt: number; readonly finishedAt: number; readonly previous: Readonly; readonly current: Readonly; readonly patches: readonly StatePatch[]; readonly inversePatches: readonly StatePatch[]; readonly result?: Result; readonly error?: unknown; } export interface AtomicScope> { read(): Readonly; edit(recipe: Recipe): void; invoke(name: Name, payload: PayloadOf, meta?: RunMeta): Promise>; } export interface Domain> { readonly name: string; read(): Readonly; initial(): Readonly; revision(): number; run(name: Name, payload: PayloadOf, meta?: RunMeta): Promise>; preview(name: Name, payload: PayloadOf, meta?: RunMeta): Promise>>; atomic(label: string, operation: (scope: AtomicScope) => Awaitable, meta?: RunMeta): Promise; watch(listener: (event: DomainEvent) => void): Stop; watchSlice(select: (state: Readonly) => Slice, listener: (slice: Slice, previous: Slice, event: DomainEvent) => void, equality?: Equality, fireImmediately?: boolean): Stop; checkpoint(): Checkpoint; restore(checkpoint: Checkpoint, meta?: RunMeta): Promise; rewind(steps?: number, meta?: RunMeta): Promise; replace(next: State, label?: string, meta?: RunMeta): Promise; speculate(label: string, recipe: Recipe, effect: (signal: AbortSignal) => Awaitable, meta?: RunMeta): Promise; addModule(module: DomainModule): Stop; injectCommand(name: string, handler: CommandHandler): Stop; inspect(): DomainInspection; audit(): readonly AuditEntry[]; dispose(): void; } export interface DerivedView { read(state: Readonly): Value; clear(): void; } export interface DomainInspection { readonly revision: number; readonly queueDepth: number; readonly activeCommands: number; readonly listenerCount: number; readonly historyDepth: number; readonly auditDepth: number; readonly moduleCount: number; } //# sourceMappingURL=types.d.ts.map