import type { SnapbackProviderDiagnostic } from './diagnostics.mjs'; import type { SnapbackArtifactIndex, SnapbackContractDataManifest, } from './artifact-validation.mjs'; import type { ContractConnectionState } from './keyed-provider.mjs'; export interface OnlineContractProvider { subscribe( name: string, args: Record | undefined, observer: (cell: Record) => void, ): { dispose(): void }; readonly [key: string]: unknown; } export interface OnlineSnapbackContractSurface { readonly adapterVersion: 1; readonly capabilityClass: 'Online'; readonly boundary: unknown; readonly provider: OnlineContractProvider; readonly links: Readonly) => unknown>>; readonly diagnostics: SnapbackProviderDiagnostic[]; readonly livePush: boolean; readonly liveQueries: readonly string[]; readonly rootId: string; connection(name?: string): ContractConnectionState; connections(): Record; pendingCount(): number; flush(): Promise; dispose(): void; } /** * Create a small server-authoritative Online surface over fixed boot scopes. * Use createKeyedSnapbackContractProvider for binding-time keyed identity and * the full root surface for coordinated authority or retained/offline work. */ export function createOnlineSnapbackContractSurface(options: { runtime: { createContractMockQueryBoundary(initialRows: Record): unknown; createBoundaryContractDataProvider( manifest: SnapbackContractDataManifest, boundary: unknown, options: Record, ): OnlineContractProvider; createProviderQueryHandle( provider: OnlineContractProvider, name: string, args: Record, ): unknown; }; client: { query(name: string, options: Record): Promise<{ rows?: unknown[] }>; mutate(name: string, options: Record): Promise; liveQuery?(name: string, options: Record): Promise<{ rows?: unknown[]; connection?: ContractConnectionState; dispose?(): void; }>; authorityFence?: unknown; authCoordinator?: unknown; agentAuthority?: unknown; }; manifest: SnapbackContractDataManifest; artifactIndex?: SnapbackArtifactIndex | null; schemaManifest?: Readonly> | null; functionManifest?: Readonly> | null; userId?: string; liveQueries: readonly (string | Readonly<{ name: string; args?: Record }>)[]; requiredQueries?: readonly (string | Readonly<{ name: string }>)[] | null; livePush?: boolean; liveFallbackToPoll?: boolean; connectionId?: string | null; liveStreamOptions?: Record; onConnectionChange?: | ((connection: ContractConnectionState, detail: Readonly>) => void) | null; onSubscriptionEvent?: ((event: Readonly>) => void) | null; rootId?: string; }): Promise;