@klum-db/lobby 0.4.0-pre.0 → 0.4.0-pre.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- import { Vault, SealingKeyProvider, Noydb } from '@noy-db/hub/cargo';
1
+ import { ExtractionPreview, Vault, SealingKeyProvider, Noydb } from '@noy-db/hub/cargo';
2
2
  export { CrossShardJoinError, CustodyApi, DataResidencyError, DeedMarker, GrantCustodianOptions, LiberateOptions, LiberateResult, ReservedVaultNameError, ShardProvisioningError, UnknownShardError, VaultTemplateNotFoundError, createDeedOwner, isDeedVault, liberateVault, loadDeedMarker } from '@noy-db/hub/cargo';
3
- import { a as VaultTemplate, S as StateManagementVault, V as VaultGroup, b as SkippedVault, M as MergeCompartmentOptions, c as MergeReport, d as SurfaceDirection, e as SurfaceConflictPolicy, f as SurfaceRow, g as VaultGroupOptions } from './vault-group-D0EC-D5c.js';
4
- export { C as CapturedBlueprint, h as CrossVaultAggregation, i as CrossVaultDerivationContext, j as CrossVaultDerivationSpec, k as CrossVaultGroupedAggregation, G as CrossVaultGroupedRow, l as CrossVaultLiveAggregation, m as CrossVaultLiveQuery, D as DecryptedMergeOptions, n as DeploymentEvent, F as FanoutQueryOptions, o as FanoutResult, p as FederatedRetrieveHit, q as FederatedRetrieveOptions, r as FederatedRetrieveResult, s as FederationMeta, t as FieldAuthorityInputs, u as FieldAuthorityPolicy, v as FieldAuthorityPolicyMissingError, w as FieldAuthorityRule, x as FieldLevelDeferredError, y as GroupMeta, I as InsightAutoPushConfig, L as LiveQueryOptions, z as MergeConflict, A as MergeStrategy, B as MigrationStatusRow, R as RefreshInsightsResult, E as SchemaManifestRow, H as SchemaRolloutResult, J as ShardedCollection, K as ShardedGroupedQuery, N as ShardedQuery, O as ShardingConfig, P as SurfaceStatus, Q as VaultRegistryRow, T as mergeCompartment, U as mergeDecryptedRecords, W as resolveFieldAuthority, X as resolveRecordByFieldAuthority } from './vault-group-D0EC-D5c.js';
3
+ import { a as VaultRegistryRow, C as CrossVaultDerivationContext, I as InsightAutoPushConfig, V as VaultGroup, S as SkippedVault, b as VaultTemplate, c as StateManagementVault, M as MergeCompartmentOptions, d as MergeReport, e as SurfaceDirection, f as SurfaceConflictPolicy, g as SurfaceRow, h as VaultGroupOptions } from './vault-group-DJtzjwZK.js';
4
+ export { i as CapturedBlueprint, j as CrossVaultAggregation, k as CrossVaultDerivationSpec, l as CrossVaultGroupedAggregation, G as CrossVaultGroupedRow, m as CrossVaultLiveAggregation, n as CrossVaultLiveQuery, D as DecryptedMergeOptions, o as DeploymentEvent, F as FanoutQueryOptions, p as FanoutResult, q as FederatedRetrieveHit, r as FederatedRetrieveOptions, s as FederatedRetrieveResult, t as FederationMeta, u as FieldAuthorityInputs, v as FieldAuthorityPolicy, w as FieldAuthorityPolicyMissingError, x as FieldAuthorityRule, y as FieldLevelDeferredError, z as GroupMeta, L as LiveQueryOptions, A as MergeConflict, B as MergeStrategy, E as MigrationStatusRow, P as PortalInviteAuditRef, H as PortalState, R as RefreshInsightsResult, J as SchemaManifestRow, K as SchemaRolloutResult, N as ShardedCollection, O as ShardedGroupedQuery, Q as ShardedQuery, T as ShardingConfig, U as SurfaceStatus, W as mergeCompartment, X as mergeDecryptedRecords, Y as resolveFieldAuthority, Z as resolveRecordByFieldAuthority } from './vault-group-DJtzjwZK.js';
5
5
  import { AsXlsxSheetOptions } from '@noy-db/as-xlsx';
6
6
  export { MultiVaultDenormColumn, MultiVaultXlsxEntry, MultiVaultXlsxOptions } from '@noy-db/as-xlsx';
7
- import { ExtractionPreview } from '@noy-db/hub/bundle';
7
+ import { Role, Vault as Vault$1, Collection } from '@noy-db/hub';
8
+ import { ShareLink } from '@noy-db/hub/share-link';
8
9
  import { InspectableContainer } from '@noy-db/in-devtools';
9
10
  import { Cover, WritePodOptions } from '@noy-db/hub/pod';
10
11
 
@@ -126,6 +127,278 @@ declare function describeCrossVaultExtraction(openVault: (name: string) => Promi
126
127
  maxDepth?: number;
127
128
  }): Promise<CrossVaultPreview>;
128
129
 
130
+ /**
131
+ * Vendor-side deep-link addressing (#43). The share-link GRAMMAR is the
132
+ * hub's (`@noy-db/hub/share-link`, #806) — one canonical link shape for
133
+ * the LIFF permalink, the installed PWA, and the vendor console. The
134
+ * Lobby contributes the FLEET half: mapping the link's vault handle to
135
+ * the firm's registry row (resolve), and a client's registry row to its
136
+ * portal handle (build).
137
+ *
138
+ * Fail closed: unknown/foreign handles or clients throw a typed
139
+ * {@link ShareLinkResolutionError} whose message never enumerates the
140
+ * fleet (no vault ids, no partition keys beyond the caller's own input).
141
+ */
142
+
143
+ /** Machine-readable {@link ShareLinkResolutionError} discriminant. */
144
+ type ShareLinkResolutionErrorCode = 'UNKNOWN_VAULT_HANDLE' | 'UNKNOWN_CLIENT' | 'NO_PORTAL_HANDLE';
145
+ /**
146
+ * Typed failure for fleet-side share-link resolution. Standalone
147
+ * (`extends Error`) mirroring the hub's `ShareLinkParseError` style.
148
+ * Fail closed: map to an app-level 404; never fall back to a default
149
+ * vault, and never leak fleet contents through the message.
150
+ */
151
+ declare class ShareLinkResolutionError extends Error {
152
+ readonly code: ShareLinkResolutionErrorCode;
153
+ readonly name = "ShareLinkResolutionError";
154
+ constructor(code: ShareLinkResolutionErrorCode, message: string);
155
+ }
156
+ /** What {@link resolveShareLinkAgainstRegistry} returns. */
157
+ interface ResolvedShareLink {
158
+ /** The parsed link (hub grammar), as-received or parsed from the raw string. */
159
+ readonly link: ShareLink;
160
+ /** The fleet registry row the link's vault handle resolved to. */
161
+ readonly row: VaultRegistryRow;
162
+ /**
163
+ * Console-route descriptor: everything the firm app needs to mint its
164
+ * OWN console URL for the addressed record. Descriptor, not redirect —
165
+ * the Lobby returns data, the app owns its routes.
166
+ */
167
+ readonly consoleRoute: {
168
+ readonly vaultId: string;
169
+ readonly collection: string;
170
+ readonly recordId: string;
171
+ readonly period?: string;
172
+ readonly version?: number;
173
+ };
174
+ }
175
+ /** Input to {@link buildShareLinkForClient}: fleet coordinates + link context. */
176
+ interface BuildShareLinkForClientOptions {
177
+ /** The client's partition key in the fleet registry. */
178
+ readonly client: string;
179
+ /** Which VaultGroup the client belongs to (registry is shared across groups). */
180
+ readonly group: string;
181
+ readonly collection: string;
182
+ readonly record: string;
183
+ readonly period?: string;
184
+ readonly version?: number;
185
+ /** Single-use grant token — emitted only as the `#g=` fragment (hub rule). */
186
+ readonly grantToken?: string;
187
+ /** Origin prefix prepended verbatim by the hub builder (e.g. a LIFF permalink base). */
188
+ readonly base?: string;
189
+ }
190
+
191
+ /**
192
+ * Fleet-level portal provisioning (#42). One audited lobby operation
193
+ * that prepares a per-client portal vault: ensure the client shard
194
+ * exists in the fleet, assign the portal vault handle (the ULID that
195
+ * `share-link` links address, #43), apply firm custodian/admin grants,
196
+ * and issue the client's single-use, expiring magic-link invite — the
197
+ * seed for LINE-federated enrollment.
198
+ *
199
+ * Composes published primitives only: this repo's VaultGroup shard
200
+ * machinery, `@noy-db/hub` team grants (the session needs
201
+ * `teamStrategy: withTeam()`), and `@noy-db/on-magic-link`
202
+ * `issueInvite` / `issuePeerRecovery` / `revokeInvite`.
203
+ *
204
+ * Rebind (second-device enrollment, milestone security decision: new
205
+ * devices ONLY via firm re-invite) is `mode: 'rebind'` — a
206
+ * peer-recovery of the EXISTING principal, same keyring identity, no
207
+ * new principal by construction.
208
+ *
209
+ * The registry audit trail stores only safe fields (tokenId, userId,
210
+ * kind, timestamps) — NEVER the encoded invite, which carries the
211
+ * single-use temp passphrase.
212
+ *
213
+ * OIDC device-entry revocation (`revokeOidcDevice`) is deliberately
214
+ * NOT wrapped here: it requires the OIDC provider config and a live
215
+ * id-token — an auth context only the firm app holds.
216
+ */
217
+
218
+ /** A firm-side slot to ensure on the client vault (custodian/admin). */
219
+ interface PortalFirmGrant {
220
+ readonly userId: string;
221
+ readonly displayName: string;
222
+ readonly role: Role;
223
+ readonly passphrase: string;
224
+ }
225
+ /** Options for {@link provisionPortal}. */
226
+ interface ProvisionPortalOptions {
227
+ /** The client's partition key in the fleet. */
228
+ readonly client: string;
229
+ /**
230
+ * `'invite'` (default) mints a NEW principal's enrollment invite;
231
+ * `'rebind'` re-invites the EXISTING principal (second device / lost
232
+ * access) — same keyring identity, no new principal.
233
+ */
234
+ readonly mode?: 'invite' | 'rebind';
235
+ /** The client principal the invite enrolls (or re-enrolls). */
236
+ readonly invite: {
237
+ readonly userId: string;
238
+ readonly displayName: string;
239
+ /** Defaults to `'client'`. */
240
+ readonly role?: Role;
241
+ readonly ttlMs?: number;
242
+ /** Override the generated temp phrase (deterministic tests only). */
243
+ readonly tempPhrase?: string;
244
+ };
245
+ /** Firm custodian/admin slots to ensure on the client vault. */
246
+ readonly firmGrants?: readonly PortalFirmGrant[];
247
+ }
248
+ /** What {@link provisionPortal} returns. */
249
+ interface ProvisionPortalResult {
250
+ readonly vaultId: string;
251
+ /** The portal vault handle — the ULID share links address (#43). */
252
+ readonly handle: string;
253
+ /** The minted invite. `encoded` embeds after `#` in the app's invite URL. */
254
+ readonly invite: {
255
+ readonly encoded: string;
256
+ readonly tokenId: string;
257
+ readonly userId: string;
258
+ readonly expiresAt: string;
259
+ };
260
+ /** The updated fleet registry row (handle + portal audit trail). */
261
+ readonly row: VaultRegistryRow;
262
+ }
263
+ /** Options for {@link revokePortalInvite}. */
264
+ interface RevokePortalInviteOptions {
265
+ readonly client: string;
266
+ readonly tokenId: string;
267
+ }
268
+
269
+ /** Explicit ZK surface: the only fields a model may emit. */
270
+ interface ReadModelPosture {
271
+ readonly surface: readonly string[];
272
+ }
273
+ /** Rollup model: per-shard reduce → one summary row per shard. */
274
+ interface RollupModelSpec<R = Record<string, unknown>, S extends Record<string, unknown> = Record<string, unknown>> {
275
+ /** Output collection name in the read-model vault. */
276
+ readonly name: string;
277
+ readonly kind: 'rollup';
278
+ /** Collection read from each shard (plain or MV-output — the engine is agnostic). */
279
+ readonly source: string;
280
+ /** Per-shard reducer. Must be pure — no clock, no randomness. */
281
+ readonly derive: (records: R[], ctx: CrossVaultDerivationContext) => S;
282
+ readonly posture: ReadModelPosture;
283
+ }
284
+ /**
285
+ * Mirror model (S2, #56): per-record replication of each shard's
286
+ * `source` collection (plain or #810-MV-output — the engine is
287
+ * agnostic) into one group-wide collection. Row id =
288
+ * `${shard}:${idOf(row)}` — identity is in-band, the same idiom as
289
+ * `sharding.keyOf`.
290
+ */
291
+ interface MirrorModelSpec<R = Record<string, unknown>> {
292
+ /** Output collection name in the read-model vault. */
293
+ readonly name: string;
294
+ readonly kind: 'mirror';
295
+ /** Collection read from each shard (plain or MV-output — the engine is agnostic). */
296
+ readonly source: string;
297
+ /** Extract the source record's id (must be pure; parallel to `sharding.keyOf`). */
298
+ readonly idOf: (row: R) => string;
299
+ readonly posture: ReadModelPosture;
300
+ }
301
+ /** `never` makes caller-typed `derive`/`idOf` params assignable (contravariance). */
302
+ type ReadModelSpec = RollupModelSpec<never> | MirrorModelSpec<never>;
303
+ /** Options for `Lobby.openReadModel`. */
304
+ interface OpenReadModelOptions {
305
+ /** The read-model vault. Must not be the group or one of its shards. */
306
+ readonly vault: string;
307
+ readonly models: readonly ReadModelSpec[];
308
+ /**
309
+ * Freshness (spec § 3). `autoPush` wires the #13 controller: a write
310
+ * on any model's `source` re-derives THAT shard's contribution only
311
+ * (never a full fan-out), coalesced per microtask — or on a
312
+ * reset-debounce timer via `{ debounceMs }`; `{ minVersion }` gates
313
+ * behind-version shards. Default off: explicit `refresh()` only.
314
+ */
315
+ readonly freshness?: {
316
+ readonly autoPush?: boolean | InsightAutoPushConfig;
317
+ };
318
+ /**
319
+ * Audience subset (spec § 5): only registry rows passing this
320
+ * predicate feed the read-model (e.g. an advisor's clients). Rows of
321
+ * a shard that falls OUT of scope retract on the next refresh — a
322
+ * narrowed audience never keeps out-of-scope data. Must be pure.
323
+ * Absent = the whole group.
324
+ */
325
+ readonly shards?: (row: VaultRegistryRow) => boolean;
326
+ }
327
+ /** The result of {@link ReadModel.refresh}. */
328
+ interface ReadModelRefreshResult {
329
+ readonly written: number;
330
+ /** Rows removed by reconciliation: deleted sources + departed shards. */
331
+ readonly retracted: number;
332
+ readonly skippedVaults: SkippedVault[];
333
+ }
334
+ /** Fail-closed posture breach: a model emitted a field outside its declared surface. */
335
+ declare class PostureViolationError extends Error {
336
+ readonly model: string;
337
+ readonly fields: readonly string[];
338
+ readonly shard: string;
339
+ readonly name = "PostureViolationError";
340
+ constructor(model: string, fields: readonly string[], shard: string);
341
+ }
342
+ /**
343
+ * A maintained federated read-model. Read side is deliberately boring:
344
+ * {@link collection} returns ordinary collections in the read-model
345
+ * vault — one query, never N shard opens.
346
+ */
347
+ declare class ReadModel<T> {
348
+ private readonly group;
349
+ private readonly vaultName;
350
+ private readonly vault;
351
+ private readonly models;
352
+ private readonly shards?;
353
+ /** @internal — auto-push controller; armed by {@link _armAutoPush}. */
354
+ private autoPush;
355
+ /** @internal */
356
+ constructor(group: VaultGroup<T>, vaultName: string, vault: Vault$1, models: readonly ReadModelSpec[], shards?: ((row: VaultRegistryRow) => boolean) | undefined);
357
+ /**
358
+ * @internal — wire the #13 controller (spec § 3). Trigger is the
359
+ * Noydb-level change stream filtered to this group's shard vaults
360
+ * (`<group>--<pk>`); the read-model vault can never match that prefix
361
+ * (guarded at open), so its own writes can't loop back. Recompute is
362
+ * a per-shard `refresh({ only })` — rollup re-reduces and mirror
363
+ * reconciles just that shard; other shards' rows are untouched
364
+ * (registered shards are preserved by the reconcile asymmetry).
365
+ */
366
+ _armAutoPush(cfg: InsightAutoPushConfig): void;
367
+ /**
368
+ * Await any pending auto-push flush. Resolves immediately when
369
+ * `freshness.autoPush` is off or nothing is pending.
370
+ */
371
+ whenSettled(): Promise<void>;
372
+ /** An output collection of the read-model vault (keyed by model `name`). */
373
+ collection<S extends Record<string, unknown> = Record<string, unknown>>(model: string): Collection<S>;
374
+ /**
375
+ * Explicit refresh: for each model, read every eligible shard's
376
+ * `source`, posture-check, and write — rollup: one summary row per
377
+ * shard (id = partitionKey); mirror: one row per source record
378
+ * (id = `${shard}:${idOf(row)}`). Every row is stamped with `_shard`
379
+ * + `_sourceVersion` (mirror rows additionally `_sourceId`).
380
+ *
381
+ * Reconciliation (spec § 4): rows whose source record is gone, and
382
+ * all rows of a shard that LEFT the group, are deleted (`retracted`).
383
+ * Rows of a merely-unreachable shard are PRESERVED — offline is not
384
+ * departure; those shards land in `skippedVaults` instead.
385
+ */
386
+ refresh(options?: {
387
+ minVersion?: number;
388
+ concurrency?: number;
389
+ only?: readonly string[];
390
+ failFast?: boolean;
391
+ }): Promise<ReadModelRefreshResult>;
392
+ /**
393
+ * Delete stale rows: id not in `expected` AND the row's shard is
394
+ * healthy this refresh (source record deleted), no longer in the
395
+ * group registry (shard departed), or outside the audience predicate
396
+ * (scope narrowed — out-of-scope data never lingers, spec § 5).
397
+ * Unreachable-but-registered in-scope shards are preserved.
398
+ */
399
+ private reconcile;
400
+ }
401
+
129
402
  /**
130
403
  * @klum-db/lobby dock — the foreign-format contract (unit-driver family).
131
404
  *
@@ -669,6 +942,50 @@ declare class Lobby {
669
942
  * the full tier (keyring, CEK, provenance, custody).
670
943
  */
671
944
  graduate(docked: DockedUnit, opts: GraduateOptions): Promise<GraduationReport>;
945
+ /**
946
+ * Resolve a portal share link (raw URL/path or a parsed `ShareLink`)
947
+ * against the fleet registry: `vaultHandle → registry row` plus a
948
+ * console-route descriptor the firm app turns into its own URL.
949
+ * Unknown/foreign handles fail closed with `ShareLinkResolutionError`.
950
+ * Delegates to `resolveShareLinkAgainstRegistry` in `portal/share-link.ts`.
951
+ */
952
+ resolveShareLink(link: string | URL | ShareLink, opts: {
953
+ readonly registry: Collection<VaultRegistryRow>;
954
+ }): Promise<ResolvedShareLink>;
955
+ /**
956
+ * Mint a portal share link for a fleet client (`client` partition key +
957
+ * `group`), delegating the link grammar to `@noy-db/hub/share-link`.
958
+ * Fails closed when the client is unknown or has no portal handle.
959
+ * Delegates to `buildShareLinkForClient` in `portal/share-link.ts`.
960
+ */
961
+ buildShareLink(parts: BuildShareLinkForClientOptions, opts: {
962
+ readonly registry: Collection<VaultRegistryRow>;
963
+ }): Promise<string>;
964
+ /**
965
+ * Provision (or re-invite, `mode: 'rebind'`) a client portal vault in
966
+ * one audited operation: ensure the shard, assign the portal handle
967
+ * (#43's link target), apply firm grants, issue the magic-link invite,
968
+ * stamp the audit trail on the fleet registry row.
969
+ * Needs `@noy-db/on-magic-link` (optional peer) and a session created
970
+ * with `teamStrategy: withTeam()`.
971
+ * Delegates to `provisionPortal` in `portal/provision.ts`.
972
+ */
973
+ provisionPortal<T>(group: VaultGroup<T>, opts: ProvisionPortalOptions): Promise<ProvisionPortalResult>;
974
+ /**
975
+ * Revoke an outstanding portal invite and stamp `revokedAt` on the
976
+ * fleet audit trail. Idempotent; fails closed on an unknown tokenId.
977
+ * Delegates to `revokePortalInvite` in `portal/provision.ts`.
978
+ */
979
+ revokePortalInvite<T>(group: VaultGroup<T>, opts: RevokePortalInviteOptions): Promise<VaultRegistryRow>;
980
+ /**
981
+ * Open a maintained federated read-model over `group` (#44 S1): rollup
982
+ * models reduce each shard's `source` into one summary row per shard in
983
+ * the read-model vault — deterministic ids, `_shard`/`_sourceVersion`
984
+ * provenance, fail-closed `posture.surface` allowlist, explicit
985
+ * `refresh()`. Spec: docs/federated-read-model.md.
986
+ * Delegates to `openReadModel` in `federation/read-model.ts`.
987
+ */
988
+ openReadModel<T>(group: VaultGroup<T>, opts: OpenReadModelOptions): Promise<ReadModel<T>>;
672
989
  /**
673
990
  * Export a scoped partition from `vaultName` bounded to the given surface.
674
991
  * Delegates to `exportSurface` in `interchange/surface.ts`.
@@ -704,4 +1021,4 @@ declare class Lobby {
704
1021
  }
705
1022
  declare function createLobby(noydb: Noydb): Lobby;
706
1023
 
707
- export { type CompartmentManifest, type CompartmentMeta, type CrossVaultClosurePlan, CrossVaultDanglingRefError, type CrossVaultPreview, type CrossVaultRef, type CrossVaultSeed, DockedUnit, type ExportMultiVaultXlsxOptions, type ExtractCrossVaultOptions, type ExtractCrossVaultResult, type GraduateOptions, type GraduationReport, type GroupMeterReport, type GroupShardMetrics, InMemoryUnitDriver, Lobby, MergeCompartmentOptions, MergeReport, type MigrateThenMergeOptions, type MigrateThenMergeReport, type MigrationStep, MigrationTransformRequiredError, MinVersionError, type MultiBundleManifest, type MultiVaultCompartmentInput, NOYDB_MULTI_BUNDLE_MAGIC, NOYDB_MULTI_BUNDLE_PREFIX_BYTES, NOYDB_MULTI_BUNDLE_VERSION, SkippedVault, StateManagementVault, SurfaceCadenceScheduler, SurfaceConflictPolicy, type SurfaceDefinition, SurfaceDirection, SurfaceNotFoundError, SurfaceRow, SurfaceStateError, type UnitDriver, UnitGraduationError, VaultGroup, VaultGroupOptions, VaultTemplate, agreeSurface, applySurface, createLobby, decodeMultiBundle, describeCrossVaultExtraction, encodeMultiBundle, exportSurface, extractCrossVaultPartition, groupInspector, isSurfaceDue, listDueSurfaces, markSynced, meterGroup, migrateThenMerge, proposeSurface, readMultiVaultBundleCompartment, readNoydbBundleManifest, walkCrossVaultClosure, writeMultiVaultBundle };
1024
+ export { type BuildShareLinkForClientOptions, type CompartmentManifest, type CompartmentMeta, type CrossVaultClosurePlan, CrossVaultDanglingRefError, CrossVaultDerivationContext, type CrossVaultPreview, type CrossVaultRef, type CrossVaultSeed, DockedUnit, type ExportMultiVaultXlsxOptions, type ExtractCrossVaultOptions, type ExtractCrossVaultResult, type GraduateOptions, type GraduationReport, type GroupMeterReport, type GroupShardMetrics, InMemoryUnitDriver, InsightAutoPushConfig, Lobby, MergeCompartmentOptions, MergeReport, type MigrateThenMergeOptions, type MigrateThenMergeReport, type MigrationStep, MigrationTransformRequiredError, MinVersionError, type MirrorModelSpec, type MultiBundleManifest, type MultiVaultCompartmentInput, NOYDB_MULTI_BUNDLE_MAGIC, NOYDB_MULTI_BUNDLE_PREFIX_BYTES, NOYDB_MULTI_BUNDLE_VERSION, type OpenReadModelOptions, type PortalFirmGrant, PostureViolationError, type ProvisionPortalOptions, type ProvisionPortalResult, ReadModel, type ReadModelPosture, type ReadModelRefreshResult, type ReadModelSpec, type ResolvedShareLink, type RevokePortalInviteOptions, type RollupModelSpec, ShareLinkResolutionError, type ShareLinkResolutionErrorCode, SkippedVault, StateManagementVault, SurfaceCadenceScheduler, SurfaceConflictPolicy, type SurfaceDefinition, SurfaceDirection, SurfaceNotFoundError, SurfaceRow, SurfaceStateError, type UnitDriver, UnitGraduationError, VaultGroup, VaultGroupOptions, VaultRegistryRow, VaultTemplate, agreeSurface, applySurface, createLobby, decodeMultiBundle, describeCrossVaultExtraction, encodeMultiBundle, exportSurface, extractCrossVaultPartition, groupInspector, isSurfaceDue, listDueSurfaces, markSynced, meterGroup, migrateThenMerge, proposeSurface, readMultiVaultBundleCompartment, readNoydbBundleManifest, walkCrossVaultClosure, writeMultiVaultBundle };