@abloatai/ablo 0.34.1 → 0.36.0
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/AGENTS.md +2 -1
- package/CHANGELOG.md +758 -5
- package/README.md +56 -502
- package/bin/ablo.cjs +39 -0
- package/dist/BaseSyncedStore.d.ts +176 -48
- package/dist/BaseSyncedStore.js +346 -214
- package/dist/Database.d.ts +17 -44
- package/dist/Database.js +96 -79
- package/dist/InstanceCache.d.ts +31 -6
- package/dist/InstanceCache.js +65 -30
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +23 -13
- package/dist/Model.js +27 -17
- package/dist/ModelRegistry.d.ts +8 -4
- package/dist/ModelRegistry.js +20 -18
- package/dist/NetworkMonitor.d.ts +3 -1
- package/dist/NetworkMonitor.js +7 -5
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +47 -47
- package/dist/SyncClient.js +215 -156
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +129 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +8 -4
- package/dist/client/createInternalComponents.js +17 -10
- package/dist/client/createModelProxy.d.ts +98 -373
- package/dist/client/createModelProxy.js +233 -139
- package/dist/client/humans.d.ts +69 -0
- package/dist/client/humans.js +78 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +53 -0
- package/dist/client/reactiveEngine.js +688 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/storeCluster.d.ts +47 -0
- package/dist/client/storeCluster.js +118 -0
- package/dist/client/storeLifecycle.d.ts +61 -0
- package/dist/client/storeLifecycle.js +231 -0
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +22 -9
- package/dist/context.js +33 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +230 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +44 -36
- package/dist/index.js +30 -22
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +5 -2
- package/dist/query/client.js +10 -9
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +18 -8
- package/dist/react/AbloProvider.js +10 -9
- package/dist/react/context.d.ts +3 -3
- package/dist/react/context.js +1 -1
- package/dist/react/createAbloReact.d.ts +56 -0
- package/dist/react/createAbloReact.js +51 -0
- package/dist/react/index.d.ts +6 -5
- package/dist/react/index.js +6 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +12 -5
- package/dist/react/useAblo.js +26 -8
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +90 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +11 -10
- package/dist/schema/index.js +22 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +6 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +20 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapter.d.ts +7 -5
- package/dist/source/adapter.js +7 -5
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
- package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
- package/dist/{core → stores}/DatabaseManager.js +14 -13
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/{core → stores}/StoreManager.d.ts +9 -26
- package/dist/{core → stores}/StoreManager.js +29 -77
- package/dist/stores/SyncActionStore.d.ts +4 -2
- package/dist/stores/SyncActionStore.js +11 -17
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +127 -6
- package/dist/sync/BootstrapFetcher.js +511 -83
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +5 -2
- package/dist/sync/OnDemandLoader.js +61 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/bootstrapApply.d.ts +3 -0
- package/dist/sync/bootstrapApply.js +2 -2
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +13 -12
- package/dist/sync/deltaPipeline.js +21 -4
- package/dist/sync/groupChange.d.ts +3 -0
- package/dist/sync/groupChange.js +16 -14
- package/dist/sync/participants.d.ts +24 -6
- package/dist/sync/participants.js +32 -23
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +23 -33
- package/dist/sync/schemas.js +29 -20
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/syncLog/contract.d.ts +20 -0
- package/dist/syncLog/contract.js +19 -0
- package/dist/syncLog/index.d.ts +1 -0
- package/dist/syncLog/index.js +1 -0
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +212 -0
- package/dist/transaction/auth/capability.js +224 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +45 -0
- package/dist/transaction/coordination/locator.d.ts +104 -0
- package/dist/transaction/coordination/locator.js +102 -0
- package/dist/transaction/coordination/schema.d.ts +1536 -0
- package/dist/transaction/coordination/schema.js +1177 -0
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +107 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
- package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/footprint.d.ts +111 -0
- package/dist/transaction/footprint.js +0 -0
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +285 -0
- package/dist/transaction/plugin.js +106 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +321 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +427 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +101 -0
- package/dist/transaction/resources/where.js +115 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +17 -23
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/fieldRef.d.ts +38 -0
- package/dist/transaction/schema/fieldRef.js +11 -0
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +58 -0
- package/dist/transaction/schema/openapi.js +501 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
- package/dist/{schema → transaction/schema}/schema.js +24 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/transaction/transport/httpClient.d.ts +131 -0
- package/dist/{client → transaction/transport}/httpClient.js +6 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +295 -97
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +574 -0
- package/dist/transaction/transport/wsTransport.js +1023 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +73 -45
- package/dist/transaction/utils/duration.d.ts +50 -0
- package/dist/{utils → transaction/utils}/duration.js +32 -0
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +420 -0
- package/dist/transaction/wire/accountResponses.js +290 -0
- package/dist/transaction/wire/auth.d.ts +56 -0
- package/dist/transaction/wire/auth.js +63 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +530 -0
- package/dist/transaction/wire/claims.js +327 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +204 -0
- package/dist/transaction/wire/feedEvent.js +65 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +562 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +54 -0
- package/dist/transaction/wire/index.js +83 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelMutations.d.ts +31 -0
- package/dist/transaction/wire/modelMutations.js +52 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transaction/wire/modelShape.d.ts +78 -0
- package/dist/transaction/wire/modelShape.js +74 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/{core → views}/QueryView.d.ts +2 -2
- package/dist/{core → views}/QueryView.js +2 -2
- package/dist/{core → views}/ViewRegistry.d.ts +1 -1
- package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
- package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +20 -13
- package/docs/api-keys.md +14 -10
- package/docs/api.md +27 -61
- package/docs/audit.md +6 -3
- package/docs/cli.md +41 -13
- package/docs/client-behavior.md +11 -9
- package/docs/concurrency-convention.md +49 -57
- package/docs/coordination.md +283 -121
- package/docs/data-sources.md +7 -5
- package/docs/debugging.md +39 -15
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +46 -45
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +87 -30
- package/docs/guarantees.md +41 -12
- package/docs/how-it-works.md +38 -12
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +77 -74
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +31 -19
- package/docs/mcp.md +46 -21
- package/docs/migration.md +95 -18
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +3 -1
- package/docs/quickstart.md +22 -5
- package/docs/react.md +31 -18
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +4 -2
- package/docs/webhooks.md +12 -10
- package/llms.txt +48 -18
- package/package.json +21 -26
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/cli.cjs +0 -286329
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/client/httpClient.d.ts +0 -80
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/coordination/schema.js +0 -578
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -192
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -71
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/duration.d.ts +0 -25
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- package/docs/interaction-model.md +0 -97
- /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
- /package/dist/{core → query}/QueryProcessor.js +0 -0
- /package/dist/{core/storeContract.js → storeContract.js} +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
- /package/dist/{core → views}/ViewRegistry.js +0 -0
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* `index: true` registers a foreign-key index for the child model when the
|
|
23
23
|
* engine starts, turning "every child that points at this parent" from a full
|
|
24
24
|
* scan into a constant-time lookup. Reach for it on relations you query this
|
|
25
|
-
* way often, such as a
|
|
25
|
+
* way often, such as a block's `sectionId`.
|
|
26
26
|
*
|
|
27
27
|
* `enrich: true` auto-populates the parent reference on an incoming change
|
|
28
28
|
* before the child data lands. A change to `Task { teamId: 't1' }` picks up the
|
|
@@ -44,11 +44,11 @@
|
|
|
44
44
|
* relax the foreign-key check itself. For example:
|
|
45
45
|
*
|
|
46
46
|
* ```ts
|
|
47
|
-
* layouts: model({
|
|
48
|
-
* // The
|
|
49
|
-
* // created first; marking it `defer` lets the
|
|
47
|
+
* layouts: model({ reportId: z.string().nullish() }, {
|
|
48
|
+
* // The report-owns-layout link is nullable and the layout is always
|
|
49
|
+
* // created first; marking it `defer` lets the report commit ahead of the
|
|
50
50
|
* // layout instead of sharing its insert-order slot.
|
|
51
|
-
*
|
|
51
|
+
* report: relation.belongsTo('reports', 'reportId', { defer: true }),
|
|
52
52
|
* }),
|
|
53
53
|
* ```
|
|
54
54
|
*/
|
|
@@ -65,14 +65,14 @@ export interface BelongsToOptions {
|
|
|
65
65
|
* container to the things it holds, as a folder does to its files.
|
|
66
66
|
*
|
|
67
67
|
* Do not set `parent` on a reference that merely points at another record for
|
|
68
|
-
* provenance or as a template, such as `
|
|
68
|
+
* provenance or as a template, such as `sourceSectionId` or `templateId`; doing
|
|
69
69
|
* so would leak the record into an unrelated scope. The engine also cannot
|
|
70
70
|
* infer the parent from whether a field is optional — many real parent keys
|
|
71
71
|
* are optional, like a root folder or an inbox task — so you must declare the
|
|
72
72
|
* parent edge explicitly.
|
|
73
73
|
*
|
|
74
74
|
* It reads naturally at the call site:
|
|
75
|
-
* `belongsTo('
|
|
75
|
+
* `belongsTo('report', 'reportId', { parent: true })` — the report is the parent.
|
|
76
76
|
*/
|
|
77
77
|
readonly parent?: boolean;
|
|
78
78
|
/**
|
|
@@ -84,7 +84,7 @@ export interface BelongsToOptions {
|
|
|
84
84
|
*
|
|
85
85
|
* Set `fk: true` only when the target row lives in the same database and is
|
|
86
86
|
* written in the same commit as this row, and points at a strong, contained
|
|
87
|
-
* entity. Leave it off provenance or template pointers (`
|
|
87
|
+
* entity. Leave it off provenance or template pointers (`sourceSectionId`,
|
|
88
88
|
* `templateId`), cross-tenant references, or anything that may be written in a
|
|
89
89
|
* different transaction than its target — a hard constraint there would reject
|
|
90
90
|
* the write and break out-of-order sync. The constraint is emitted as
|
|
@@ -96,7 +96,13 @@ export interface BelongsToOptions {
|
|
|
96
96
|
declare const __relationType: unique symbol;
|
|
97
97
|
declare const __relationTarget: unique symbol;
|
|
98
98
|
declare const __relationField: unique symbol;
|
|
99
|
-
|
|
99
|
+
/**
|
|
100
|
+
* The three edges the engine resolves. Inferred from `wire/modelShape.ts`
|
|
101
|
+
* rather than restated: the set is reported to callers by `GET /api/schema`,
|
|
102
|
+
* so it is protocol, and protocol has one definition.
|
|
103
|
+
*/
|
|
104
|
+
export type { RelationType } from '../wire/modelShape.js';
|
|
105
|
+
import type { RelationType } from '../wire/modelShape.js';
|
|
100
106
|
/**
|
|
101
107
|
* A relation definition, carrying its type information at both the type and
|
|
102
108
|
* runtime level.
|
|
@@ -157,7 +163,7 @@ export declare const relation: {
|
|
|
157
163
|
* project: relation.belongsTo('projects', 'projectId'),
|
|
158
164
|
*
|
|
159
165
|
* // Register an FK index for O(1) child lookups
|
|
160
|
-
*
|
|
166
|
+
* section: relation.belongsTo('sections', 'sectionId', { index: true }),
|
|
161
167
|
*
|
|
162
168
|
* // Auto-populate the parent on delta arrival
|
|
163
169
|
* team: relation.belongsTo('teams', 'teamId', { enrich: true }),
|
|
@@ -167,7 +173,7 @@ export declare const relation: {
|
|
|
167
173
|
*
|
|
168
174
|
* // Mark the soft side of a cycle so the priority computer breaks
|
|
169
175
|
* // the cycle deterministically instead of tying the two models.
|
|
170
|
-
*
|
|
176
|
+
* report: relation.belongsTo('reports', 'reportId', { defer: true }),
|
|
171
177
|
* ```
|
|
172
178
|
*/
|
|
173
179
|
readonly belongsTo: <Target extends string, Field extends string, const Opts extends BelongsToOptions = Record<string, never>>(target: Target, foreignKey: Field, options?: Opts) => RelationDef<"belongsTo", Target, Field, Opts>;
|
|
@@ -180,11 +186,11 @@ export declare const relation: {
|
|
|
180
186
|
* child model automatically.
|
|
181
187
|
*
|
|
182
188
|
* ```ts
|
|
183
|
-
*
|
|
184
|
-
* // →
|
|
189
|
+
* blocks: relation.hasMany('blocks', 'sectionId'),
|
|
190
|
+
* // → section.blocks returns all Block[] where sectionId === section.id
|
|
185
191
|
*
|
|
186
|
-
*
|
|
187
|
-
* // →
|
|
192
|
+
* blocks: relation.hasMany('blocks', 'sectionId', { orderBy: 'zIndex' }),
|
|
193
|
+
* // → section.blocks returns Block[] sorted by zIndex ascending
|
|
188
194
|
* ```
|
|
189
195
|
*/
|
|
190
196
|
readonly hasMany: <Target extends string, Field extends string>(target: Target, foreignKey: Field, options?: {
|
|
@@ -196,4 +202,3 @@ export declare const relation: {
|
|
|
196
202
|
*/
|
|
197
203
|
readonly hasOne: <Target extends string, Field extends string>(target: Target, foreignKey: Field) => RelationDef<"hasOne", Target, Field>;
|
|
198
204
|
};
|
|
199
|
-
export {};
|
|
@@ -33,7 +33,7 @@ class RelationBuilder {
|
|
|
33
33
|
* Stashed by `hasMany` when the caller provides `{ orderBy }`. Read
|
|
34
34
|
* back in `createSyncEngine` to install the sort comparator on the
|
|
35
35
|
* generated relation getter. Declared on the builder so both writer
|
|
36
|
-
* and reader stay type-safe — no
|
|
36
|
+
* and reader stay type-safe — no double-cast smuggle through `Record<...>`.
|
|
37
37
|
*/
|
|
38
38
|
_orderBy;
|
|
39
39
|
constructor(type, target, foreignKey, options) {
|
|
@@ -55,7 +55,7 @@ export const relation = {
|
|
|
55
55
|
* project: relation.belongsTo('projects', 'projectId'),
|
|
56
56
|
*
|
|
57
57
|
* // Register an FK index for O(1) child lookups
|
|
58
|
-
*
|
|
58
|
+
* section: relation.belongsTo('sections', 'sectionId', { index: true }),
|
|
59
59
|
*
|
|
60
60
|
* // Auto-populate the parent on delta arrival
|
|
61
61
|
* team: relation.belongsTo('teams', 'teamId', { enrich: true }),
|
|
@@ -65,7 +65,7 @@ export const relation = {
|
|
|
65
65
|
*
|
|
66
66
|
* // Mark the soft side of a cycle so the priority computer breaks
|
|
67
67
|
* // the cycle deterministically instead of tying the two models.
|
|
68
|
-
*
|
|
68
|
+
* report: relation.belongsTo('reports', 'reportId', { defer: true }),
|
|
69
69
|
* ```
|
|
70
70
|
*/
|
|
71
71
|
belongsTo(target, foreignKey, options) {
|
|
@@ -80,11 +80,11 @@ export const relation = {
|
|
|
80
80
|
* child model automatically.
|
|
81
81
|
*
|
|
82
82
|
* ```ts
|
|
83
|
-
*
|
|
84
|
-
* // →
|
|
83
|
+
* blocks: relation.hasMany('blocks', 'sectionId'),
|
|
84
|
+
* // → section.blocks returns all Block[] where sectionId === section.id
|
|
85
85
|
*
|
|
86
|
-
*
|
|
87
|
-
* // →
|
|
86
|
+
* blocks: relation.hasMany('blocks', 'sectionId', { orderBy: 'zIndex' }),
|
|
87
|
+
* // → section.blocks returns Block[] sorted by zIndex ascending
|
|
88
88
|
* ```
|
|
89
89
|
*/
|
|
90
90
|
hasMany(target, foreignKey, options) {
|
|
@@ -27,12 +27,3 @@ export declare const residencySchema: z.ZodEnum<{
|
|
|
27
27
|
export type ModelResidency = z.infer<typeof residencySchema>;
|
|
28
28
|
/** Default residency for a model that doesn't declare one — the tenant data plane. */
|
|
29
29
|
export declare const DEFAULT_RESIDENCY: ModelResidency;
|
|
30
|
-
/** @deprecated Use `residencySchema`. */
|
|
31
|
-
export declare const planeSchema: z.ZodEnum<{
|
|
32
|
-
tenant: "tenant";
|
|
33
|
-
control: "control";
|
|
34
|
-
}>;
|
|
35
|
-
/** @deprecated Use `ModelResidency`. */
|
|
36
|
-
export type SchemaPlane = ModelResidency;
|
|
37
|
-
/** @deprecated Use `DEFAULT_RESIDENCY`. */
|
|
38
|
-
export declare const DEFAULT_PLANE: "tenant";
|
|
@@ -23,8 +23,3 @@ import { z } from 'zod';
|
|
|
23
23
|
export const residencySchema = z.enum(['tenant', 'control']);
|
|
24
24
|
/** Default residency for a model that doesn't declare one — the tenant data plane. */
|
|
25
25
|
export const DEFAULT_RESIDENCY = 'tenant';
|
|
26
|
-
// ── Deprecated aliases (published schema subpath) ───────────────────────────
|
|
27
|
-
/** @deprecated Use `residencySchema`. */
|
|
28
|
-
export const planeSchema = residencySchema;
|
|
29
|
-
/** @deprecated Use `DEFAULT_RESIDENCY`. */
|
|
30
|
-
export const DEFAULT_PLANE = DEFAULT_RESIDENCY;
|
|
@@ -14,7 +14,7 @@ import { z } from 'zod';
|
|
|
14
14
|
* Reads fields off an identity context (`organizationId`, `teamIds`).
|
|
15
15
|
*
|
|
16
16
|
* • {@link EntityRole} — "which groups does this *record* live in?" Reads
|
|
17
|
-
* fields off the record itself (`id`, `
|
|
17
|
+
* fields off the record itself (`id`, `reportId`), so the server can fan a
|
|
18
18
|
* committed delta to the right entity streams regardless of what the
|
|
19
19
|
* committer was subscribed to.
|
|
20
20
|
*
|
|
@@ -110,11 +110,11 @@ export type Role = z.infer<typeof roleSchema>;
|
|
|
110
110
|
export type IdentityRole = Role;
|
|
111
111
|
/**
|
|
112
112
|
* Record-anchored role. Reads a record field; `kind` names the group. A record
|
|
113
|
-
* can route to a group keyed by its own `id` *or* a foreign key like `
|
|
113
|
+
* can route to a group keyed by its own `id` *or* a foreign key like `reportId`.
|
|
114
114
|
*
|
|
115
115
|
* ```ts
|
|
116
|
-
* entityRole({ kind: '
|
|
117
|
-
* entityRole({ kind: '
|
|
116
|
+
* entityRole({ kind: 'report', source: 'id' }) // a report → report:<id>
|
|
117
|
+
* entityRole({ kind: 'report', source: 'reportId' }) // a block → its parent report
|
|
118
118
|
* ```
|
|
119
119
|
*/
|
|
120
120
|
export type EntityRole = Role;
|
|
@@ -203,7 +203,7 @@ export declare function entityRole(spec: {
|
|
|
203
203
|
/**
|
|
204
204
|
* Evaluate a {@link RoleSource} against a context. Absent or falsy fields yield
|
|
205
205
|
* `[]`, so a role whose field isn't present (a user with no `teamIds`, a record
|
|
206
|
-
* with no `
|
|
206
|
+
* with no `reportId`) is a silent no-op.
|
|
207
207
|
*/
|
|
208
208
|
export declare function extractRoleIds(context: RoleContext, source: RoleSource): readonly string[];
|
|
209
209
|
/** Identity-side name for {@link extractRoleIds}. */
|
|
@@ -14,7 +14,7 @@ import { z } from 'zod';
|
|
|
14
14
|
* Reads fields off an identity context (`organizationId`, `teamIds`).
|
|
15
15
|
*
|
|
16
16
|
* • {@link EntityRole} — "which groups does this *record* live in?" Reads
|
|
17
|
-
* fields off the record itself (`id`, `
|
|
17
|
+
* fields off the record itself (`id`, `reportId`), so the server can fan a
|
|
18
18
|
* committed delta to the right entity streams regardless of what the
|
|
19
19
|
* committer was subscribed to.
|
|
20
20
|
*
|
|
@@ -73,7 +73,7 @@ export function identityAnchor(kind, id) {
|
|
|
73
73
|
// ── Role source ─────────────────────────────────────────────────────────────
|
|
74
74
|
/** Validates how a role pulls ids out of a context (identity or record). */
|
|
75
75
|
export const roleSourceSchema = z.object({
|
|
76
|
-
/** The context field to read, e.g. `'organizationId'`, `'id'`, `'
|
|
76
|
+
/** The context field to read, e.g. `'organizationId'`, `'id'`, `'reportId'`. */
|
|
77
77
|
field: z.string().regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, 'source must be a valid identifier'),
|
|
78
78
|
/**
|
|
79
79
|
* When `true`, `field` holds an array; every non-empty string element yields
|
|
@@ -88,7 +88,7 @@ export const roleSourceSchema = z.object({
|
|
|
88
88
|
* no template/placeholder for the author to get wrong.
|
|
89
89
|
*/
|
|
90
90
|
export const roleSchema = z.object({
|
|
91
|
-
kind: z.string().regex(/^[a-z][a-z0-9_]*$/, 'kind must be a lowercase identifier, e.g. "
|
|
91
|
+
kind: z.string().regex(/^[a-z][a-z0-9_]*$/, 'kind must be a lowercase identifier, e.g. "report"'),
|
|
92
92
|
source: roleSourceSchema,
|
|
93
93
|
});
|
|
94
94
|
/** Validates an {@link IdentityRole}. */
|
|
@@ -102,7 +102,7 @@ export const entityRoleSchema = roleSchema;
|
|
|
102
102
|
*/
|
|
103
103
|
export const scopeSchema = z.union([
|
|
104
104
|
z.boolean(),
|
|
105
|
-
z.string().regex(/^[a-z][a-z0-9_]*$/, 'scope kind must be a lowercase identifier, e.g. "
|
|
105
|
+
z.string().regex(/^[a-z][a-z0-9_]*$/, 'scope kind must be a lowercase identifier, e.g. "workspace"'),
|
|
106
106
|
]);
|
|
107
107
|
/**
|
|
108
108
|
* Validates a model's `grants` membership edge. Both values are relation names
|
|
@@ -148,7 +148,7 @@ export function entityRole(spec) {
|
|
|
148
148
|
/**
|
|
149
149
|
* Evaluate a {@link RoleSource} against a context. Absent or falsy fields yield
|
|
150
150
|
* `[]`, so a role whose field isn't present (a user with no `teamIds`, a record
|
|
151
|
-
* with no `
|
|
151
|
+
* with no `reportId`) is a silent no-op.
|
|
152
152
|
*/
|
|
153
153
|
export function extractRoleIds(context, source) {
|
|
154
154
|
const raw = context[source.field];
|
|
@@ -23,6 +23,7 @@ import { z } from 'zod';
|
|
|
23
23
|
import type { ModelDef, RelationRecord } from './model.js';
|
|
24
24
|
import type { RelationDef } from './relation.js';
|
|
25
25
|
import type { IdentityRole } from './roles.js';
|
|
26
|
+
import { type FieldRef } from './fieldRef.js';
|
|
26
27
|
export { type IdentityRole, type IdentityRoleSource, type IdentityContext, type EntityRole, type EntityRoleSource, type EntityContext, type RoleSource, type RoleContext, type SyncGroup, type SyncGroupInput, identityRole, entityRole, extractIdentityIds, extractEntityIds, composeIdentitySyncGroups, composeEntitySyncGroups, intersectRequestedWithAllowed, syncGroup, syncGroupSchema, syncGroupInputSchema, isSyncGroupInput, identityRoleSchema, entityRoleSchema, roleSchema, roleSourceSchema, scopeSchema, grantsRefSchema, groupsInputSchema, type GroupsInput, } from './roles.js';
|
|
27
28
|
/** The set of built-in casing conventions supported by `defineSchema`. */
|
|
28
29
|
export type CasingConvention = 'snake_case' | 'camelCase';
|
|
@@ -141,7 +142,7 @@ export type BaseModelFields = z.infer<typeof baseFieldsSchema>;
|
|
|
141
142
|
* input types, since methods are not valid input.
|
|
142
143
|
*/
|
|
143
144
|
export interface BaseModelMethods {
|
|
144
|
-
/** Wire-format model name (e.g. `'
|
|
145
|
+
/** Wire-format model name (e.g. `'Section'`, `'Comment'`). */
|
|
145
146
|
getModelName(): string;
|
|
146
147
|
/** Plain-object serialization suitable for sending over the wire. */
|
|
147
148
|
toJSON(): Record<string, unknown>;
|
|
@@ -150,6 +151,23 @@ export interface BaseModelMethods {
|
|
|
150
151
|
export interface Schema<S extends SchemaRecord = SchemaRecord> {
|
|
151
152
|
/** The raw model definitions */
|
|
152
153
|
readonly models: S;
|
|
154
|
+
/**
|
|
155
|
+
* Every declared field as a {@link FieldRef} — the field as a value rather
|
|
156
|
+
* than a quoted name: `schema.fields.tasks.status`.
|
|
157
|
+
*
|
|
158
|
+
* A surface that names a field takes one of these instead of a string, so a
|
|
159
|
+
* name that does not exist stops compiling and a rename is a compile error at
|
|
160
|
+
* every use. Claims are the first caller; anything else that has to say
|
|
161
|
+
* "which field" should take a reference for the same reason.
|
|
162
|
+
*
|
|
163
|
+
* Base fields (`id`, `createdAt`, …) are not here: the schema does not
|
|
164
|
+
* declare them, and a caller naming one means the row, not a part of it.
|
|
165
|
+
*/
|
|
166
|
+
readonly fields: {
|
|
167
|
+
readonly [K in keyof S]: S[K] extends ModelDef<infer Shape> ? {
|
|
168
|
+
readonly [F in Extract<keyof Shape, string>]: FieldRef;
|
|
169
|
+
} : never;
|
|
170
|
+
};
|
|
153
171
|
/** Zod schemas with base fields merged in */
|
|
154
172
|
readonly validators: {
|
|
155
173
|
readonly [K in keyof S]: S[K] extends ModelDef<infer Shape> ? z.ZodObject<Shape & typeof baseFieldsSchema.shape> : never;
|
|
@@ -208,9 +226,11 @@ type RegisteredSchema = import('../types/global.js').Register extends {
|
|
|
208
226
|
*/
|
|
209
227
|
export type Model<A, B = never> = [B] extends [never] ? A extends keyof RegisteredSchema['models'] ? InferModel<RegisteredSchema, A> : never : A extends Schema ? InferModel<A, B extends keyof A['models'] ? B : never> : never;
|
|
210
228
|
/**
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
229
|
+
* The row type {@link Model} resolves to. Internal: `Model<typeof schema,
|
|
230
|
+
* 'tasks'>` is the published spelling, because it reads as the domain rather
|
|
231
|
+
* than the machinery. This one is no longer exported from any subpath — it
|
|
232
|
+
* stays because `Model` is defined in terms of it, not as a second name for
|
|
233
|
+
* the same idea.
|
|
214
234
|
*/
|
|
215
235
|
export type InferModel<S extends Schema, ModelName extends keyof S['models']> = S['models'][ModelName] extends ModelDef<infer Shape, infer R, infer C> ? // `Omit<…, keyof BaseModelFields>` so a model that (wrongly) redeclares a
|
|
216
236
|
Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & BaseModelMethods & InferComputed<C> & InferRelations<S, R> : never;
|
|
@@ -218,7 +238,7 @@ Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & Bas
|
|
|
218
238
|
* Infer the relation accessor types from a model's relations record.
|
|
219
239
|
*
|
|
220
240
|
* At runtime the engine installs a getter for each declared relation, so this
|
|
221
|
-
* type mirrors them and you can read `
|
|
241
|
+
* type mirrors them and you can read `section.blocks` and `section.report` without a
|
|
222
242
|
* cast.
|
|
223
243
|
*
|
|
224
244
|
* - `hasMany` → `InferModel<S, Target>[]`
|
|
@@ -226,7 +246,7 @@ Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & Bas
|
|
|
226
246
|
* when the foreign key is unset or the parent has not loaded yet)
|
|
227
247
|
*
|
|
228
248
|
* Kept `readonly` because the accessors are getters with no setter — assigning
|
|
229
|
-
* to `
|
|
249
|
+
* to `section.blocks` would have no effect at runtime.
|
|
230
250
|
*/
|
|
231
251
|
export type InferRelations<S extends Schema, R extends RelationRecord> = string extends keyof R ? unknown : {
|
|
232
252
|
readonly [K in keyof R]: R[K] extends RelationDef<infer Type, infer Target> ? Target extends keyof S['models'] ? Type extends 'hasMany' ? InferModel<S, Target>[] : Type extends 'hasOne' | 'belongsTo' ? InferModel<S, Target> | undefined : never : never : never;
|
|
@@ -239,7 +259,7 @@ export type InferRelations<S extends Schema, R extends RelationRecord> = string
|
|
|
239
259
|
*
|
|
240
260
|
* Relations (`hasMany` / `belongsTo`) are store-backed getters that exist only
|
|
241
261
|
* on the pool's model instances, so a reactive row honestly omits them —
|
|
242
|
-
* reading `row.
|
|
262
|
+
* reading `row.blocks` is a compile error instead of a silent `undefined`.
|
|
243
263
|
* Compose relations through a selector or hook instead.
|
|
244
264
|
*
|
|
245
265
|
* The same pairing other data layers converged on: Zero's data-only `Row<...>`
|
|
@@ -253,12 +273,12 @@ Omit<z.infer<z.ZodObject<Shape>>, keyof BaseModelFields> & BaseModelFields & Inf
|
|
|
253
273
|
* `ablo/register.ts` registers the schema, a single argument is all it takes:
|
|
254
274
|
*
|
|
255
275
|
* ```ts
|
|
256
|
-
* type
|
|
257
|
-
* type
|
|
276
|
+
* type SectionRow = Row<'sections'>; // data fields + computeds, no relations
|
|
277
|
+
* type Section = Model<'sections'>; // the pool's model instance
|
|
258
278
|
* ```
|
|
259
279
|
*
|
|
260
280
|
* Without that registration, or for a second schema, pass the schema
|
|
261
|
-
* explicitly: `Row<typeof schema, '
|
|
281
|
+
* explicitly: `Row<typeof schema, 'sections'>`.
|
|
262
282
|
*/
|
|
263
283
|
export type Row<A, B = never> = [B] extends [never] ? A extends keyof RegisteredSchema['models'] ? InferRow<RegisteredSchema, A> : never : A extends Schema ? InferRow<A, B extends keyof A['models'] ? B : never> : never;
|
|
264
284
|
/**
|
|
@@ -319,4 +339,13 @@ export type UpdateValue<S extends Schema, ModelName extends keyof S['models']> =
|
|
|
319
339
|
export interface DeleteId<S extends Schema, ModelName extends keyof S['models']> {
|
|
320
340
|
id: string;
|
|
321
341
|
}
|
|
342
|
+
/**
|
|
343
|
+
* One {@link FieldRef} per declared field, keyed by model then field.
|
|
344
|
+
*
|
|
345
|
+
* Every construction of a {@link Schema} goes through here — `defineSchema`,
|
|
346
|
+
* the `selectModels`/`omitModels` projections, and the deserializer — so a
|
|
347
|
+
* projection carries references for exactly the models it kept and a schema
|
|
348
|
+
* rebuilt from JSON carries them at all.
|
|
349
|
+
*/
|
|
350
|
+
export declare function buildFieldRefs(models: Record<string, ModelDef>): Record<string, Record<string, FieldRef>>;
|
|
322
351
|
export declare function defineSchema<const S extends SchemaRecord>(models: S, options?: DefineSchemaOptions): Schema<S>;
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import { z } from 'zod';
|
|
23
23
|
import { AbloValidationError } from '../errors.js';
|
|
24
|
+
import { fieldRef } from './fieldRef.js';
|
|
24
25
|
import { scopeSchema, grantsRefSchema } from './roles.js';
|
|
25
26
|
// Sync-group roles (identity and entity) are defined in `./roles.js` and
|
|
26
27
|
// re-exported here so they can also be imported from this module. See
|
|
@@ -63,6 +64,7 @@ export const RESERVED_SESSION_SETTINGS = [
|
|
|
63
64
|
'app.current_sandbox_id',
|
|
64
65
|
'app.current_participant_id',
|
|
65
66
|
'app.current_participant_kind',
|
|
67
|
+
'app.current_user_id',
|
|
66
68
|
];
|
|
67
69
|
/**
|
|
68
70
|
* Base fields every synced model gets automatically.
|
|
@@ -152,6 +154,24 @@ function assertRoundTrippableCamelCase(modelName, fieldName) {
|
|
|
152
154
|
}
|
|
153
155
|
}
|
|
154
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* One {@link FieldRef} per declared field, keyed by model then field.
|
|
159
|
+
*
|
|
160
|
+
* Every construction of a {@link Schema} goes through here — `defineSchema`,
|
|
161
|
+
* the `selectModels`/`omitModels` projections, and the deserializer — so a
|
|
162
|
+
* projection carries references for exactly the models it kept and a schema
|
|
163
|
+
* rebuilt from JSON carries them at all.
|
|
164
|
+
*/
|
|
165
|
+
export function buildFieldRefs(models) {
|
|
166
|
+
const refs = {};
|
|
167
|
+
for (const [model, def] of Object.entries(models)) {
|
|
168
|
+
const perField = {};
|
|
169
|
+
for (const field of Object.keys(def.shape))
|
|
170
|
+
perField[field] = fieldRef(model, field);
|
|
171
|
+
refs[model] = perField;
|
|
172
|
+
}
|
|
173
|
+
return refs;
|
|
174
|
+
}
|
|
155
175
|
export function defineSchema(models, options) {
|
|
156
176
|
// Build validators with base fields merged in, and resolve defaults for
|
|
157
177
|
// `typename` and `persist.store` so downstream code (the loader and the
|
|
@@ -159,10 +179,10 @@ export function defineSchema(models, options) {
|
|
|
159
179
|
// them at every call site.
|
|
160
180
|
//
|
|
161
181
|
// Defaults:
|
|
162
|
-
// typename ← schema key (e.g. `
|
|
182
|
+
// typename ← schema key (e.g. `block` → `'block'`)
|
|
163
183
|
// persist.store ← typename (only resolved when `persist` was provided)
|
|
164
184
|
//
|
|
165
|
-
// A consumer that passes `typename: '
|
|
185
|
+
// A consumer that passes `typename: 'Block'` explicitly (common when
|
|
166
186
|
// the wire shape uses PascalCase while the schema key is camelCase) keeps
|
|
167
187
|
// that value — the fallback only fires when the field is unset.
|
|
168
188
|
//
|
|
@@ -227,6 +247,7 @@ export function defineSchema(models, options) {
|
|
|
227
247
|
// already part of ModelDef, so the shape is structurally unchanged.
|
|
228
248
|
models: resolvedModels,
|
|
229
249
|
validators: validators,
|
|
250
|
+
fields: buildFieldRefs(resolvedModels),
|
|
230
251
|
identityRoles: options?.identityRoles ?? [],
|
|
231
252
|
sessionSettings: options?.sessionSettings ?? {},
|
|
232
253
|
};
|
|
@@ -266,7 +287,7 @@ function validateSyncGroupSchema(models) {
|
|
|
266
287
|
for (const [name, def] of Object.entries(models)) {
|
|
267
288
|
// Shape-validate the `scope` declaration via the shared Zod schema.
|
|
268
289
|
if (def.scope !== undefined && !scopeSchema.safeParse(def.scope).success) {
|
|
269
|
-
throw new AbloValidationError(`Model "${name}": scope kind "${String(def.scope)}" must be a lowercase identifier (e.g. '
|
|
290
|
+
throw new AbloValidationError(`Model "${name}": scope kind "${String(def.scope)}" must be a lowercase identifier (e.g. 'workspace').`, { code: 'schema_scope_kind_invalid', param: `${name}.scope` });
|
|
270
291
|
}
|
|
271
292
|
if (!def.grants)
|
|
272
293
|
continue;
|
|
@@ -26,7 +26,7 @@ import { z } from 'zod';
|
|
|
26
26
|
export declare const DEFAULT_ORG_COLUMN = "organization_id";
|
|
27
27
|
/**
|
|
28
28
|
* Scopes a table's rows through a parent table, for rows that carry no tenancy
|
|
29
|
-
* column of their own (for example,
|
|
29
|
+
* column of their own (for example, blocks scoped through their section, report,
|
|
30
30
|
* and organization). This is the canonical `parent` payload; authors write the
|
|
31
31
|
* friendlier {@link PolicyInput} `{ by: 'parent', fk, parent }` form, which
|
|
32
32
|
* {@link resolvePolicy} normalizes into this.
|
|
@@ -26,7 +26,7 @@ import { z } from 'zod';
|
|
|
26
26
|
export const DEFAULT_ORG_COLUMN = 'organization_id';
|
|
27
27
|
/**
|
|
28
28
|
* Scopes a table's rows through a parent table, for rows that carry no tenancy
|
|
29
|
-
* column of their own (for example,
|
|
29
|
+
* column of their own (for example, blocks scoped through their section, report,
|
|
30
30
|
* and organization). This is the canonical `parent` payload; authors write the
|
|
31
31
|
* friendlier {@link PolicyInput} `{ by: 'parent', fk, parent }` form, which
|
|
32
32
|
* {@link resolvePolicy} normalizes into this.
|
|
@@ -90,9 +90,9 @@ export const policyInputSchema = z
|
|
|
90
90
|
by: z.enum(['column', 'parent', 'none', 'source']),
|
|
91
91
|
/** `by: 'column'` — override the physical tenancy column name. Default {@link DEFAULT_ORG_COLUMN}. */
|
|
92
92
|
column: z.string().min(1).optional(),
|
|
93
|
-
/** `by: 'parent'` — column on this table that points at the parent (for example, `'
|
|
93
|
+
/** `by: 'parent'` — column on this table that points at the parent (for example, `'sectionId'`). */
|
|
94
94
|
fk: z.string().min(1).optional(),
|
|
95
|
-
/** `by: 'parent'` — parent table name (e.g. `'
|
|
95
|
+
/** `by: 'parent'` — parent table name (e.g. `'sections'`). */
|
|
96
96
|
parent: z.string().min(1).optional(),
|
|
97
97
|
/** `by: 'parent'` — column on the parent that `fk` references. Default `'id'`. */
|
|
98
98
|
parentKey: z.string().min(1).optional(),
|
|
@@ -138,7 +138,10 @@ export const policyInputSchema = z
|
|
|
138
138
|
});
|
|
139
139
|
}
|
|
140
140
|
});
|
|
141
|
-
const _policyInputAssignable =
|
|
141
|
+
const _policyInputAssignable = [
|
|
142
|
+
true,
|
|
143
|
+
true,
|
|
144
|
+
];
|
|
142
145
|
void _policyInputAssignable;
|
|
143
146
|
/**
|
|
144
147
|
* Normalizes the authoring {@link PolicyInput} into the canonical {@link Tenancy}.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The transaction layer's seam — the surface the sync engine (and any other
|
|
3
|
+
* caller) sits on. ADR 0013's thesis as an interface: the layer defines,
|
|
4
|
+
* orders, settles, and authorizes changes; it holds no materialised state.
|
|
5
|
+
*
|
|
6
|
+
* `observe()` is the whole seam in one method. The sync engine is `observe()`
|
|
7
|
+
* piped into a materializer — deltas → local store → IndexedDB → reactive
|
|
8
|
+
* re-render — plus local optimistic mutations reconciled against `commit()` /
|
|
9
|
+
* `settled()`. Everything reactive is downstream of that method; the
|
|
10
|
+
* transaction layer never calls up into it.
|
|
11
|
+
*
|
|
12
|
+
* `participant` stays the WHO (user | agent | system), never the name of this.
|
|
13
|
+
* The taught verbs map onto the seam directly: `create`/`update`/`delete` are
|
|
14
|
+
* operations inside a `commit()` payload; `claim` is `claim()`; `track` rides
|
|
15
|
+
* the commit payload's `track` field (a durable premise is a zero-operation
|
|
16
|
+
* commit). Presence (`join`) is deliberately absent: it is live observation
|
|
17
|
+
* over a socket, and it joins the seam when its core carrier type exists —
|
|
18
|
+
* see docs/plans/transaction-core-language.md, Tier 3.
|
|
19
|
+
*
|
|
20
|
+
* This is the contract, not a runtime: nothing in this package implements it
|
|
21
|
+
* yet. The first explicit implementation (a headless client, a test harness)
|
|
22
|
+
* gains a compile-time conformance pin against this interface.
|
|
23
|
+
*/
|
|
24
|
+
import type { CommitMessage } from './wire/frames.js';
|
|
25
|
+
import type { CommitReceiptWire } from './wire/commit.js';
|
|
26
|
+
import type { Delta, HeldClaim, ClaimTarget, ClaimLeaseOptions } from './types/streams.js';
|
|
27
|
+
import type { ModelData } from './types/modelData.js';
|
|
28
|
+
import type { ModelScope } from './types/index.js';
|
|
29
|
+
/**
|
|
30
|
+
* A commit's durable acceptance — `{ status: 'queued' }` with the correlation
|
|
31
|
+
* the settlement feed later confirms. The wire layer names this
|
|
32
|
+
* {@link CommitReceiptWire}; the seam names it plainly.
|
|
33
|
+
*/
|
|
34
|
+
export type CommitReceipt = CommitReceiptWire;
|
|
35
|
+
/**
|
|
36
|
+
* The seam's read grammar for {@link TransactionLayer.list} — filter, order,
|
|
37
|
+
* and page through settled rows. Mirrors the taught list options
|
|
38
|
+
* (`where` / `orderBy` / `limit` / `offset` / `state`) without binding the
|
|
39
|
+
* seam to the client's local-read machinery.
|
|
40
|
+
*/
|
|
41
|
+
export interface ListQuery {
|
|
42
|
+
/** Equality filter on field values. */
|
|
43
|
+
where?: ModelData;
|
|
44
|
+
/** Sort order, field → direction. */
|
|
45
|
+
orderBy?: Record<string, 'asc' | 'desc'>;
|
|
46
|
+
limit?: number;
|
|
47
|
+
offset?: number;
|
|
48
|
+
/** Lifecycle filter; defaults to `'live'`. */
|
|
49
|
+
state?: `${ModelScope}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The transaction layer. Reads return settled state, point-in-time — never a
|
|
53
|
+
* reactive subscription. A write is an intent submitted through `commit()`;
|
|
54
|
+
* durable acceptance is the receipt (`queued`), and `settled()` resolves when
|
|
55
|
+
* the sync log has appended it (`confirmed`).
|
|
56
|
+
*/
|
|
57
|
+
export interface TransactionLayer {
|
|
58
|
+
/** Authentication: mint or renew the short-lived credential (`ek_`). */
|
|
59
|
+
ready(): Promise<void>;
|
|
60
|
+
/** Read one settled row by id, or `null` when absent. */
|
|
61
|
+
get(model: string, id: string): Promise<ModelData | null>;
|
|
62
|
+
/** Read settled rows matching a {@link ListQuery}. */
|
|
63
|
+
list(model: string, query?: ListQuery): Promise<ModelData[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Submit a batch of operations — with its idempotent `clientTxId`, its
|
|
66
|
+
* `reads` premise, and any durable `track` registrations — and receive
|
|
67
|
+
* durable acceptance.
|
|
68
|
+
*/
|
|
69
|
+
commit(payload: CommitMessage['payload']): Promise<CommitReceipt>;
|
|
70
|
+
/** Resolve when the receipt's operations have appended to the sync log. */
|
|
71
|
+
settled(receipt: CommitReceipt): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Take a FIFO lease with a fence token on a target; release through the
|
|
74
|
+
* handle (`await using` disposes it).
|
|
75
|
+
*/
|
|
76
|
+
claim(target: ClaimTarget, options?: ClaimLeaseOptions): Promise<HeldClaim>;
|
|
77
|
+
/**
|
|
78
|
+
* The authoritative change feed, scoped to one or more sync groups —
|
|
79
|
+
* omitted, everything the credential can see.
|
|
80
|
+
*/
|
|
81
|
+
observe(scope?: string | readonly string[]): AsyncIterable<Delta>;
|
|
82
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The transaction layer's seam — the surface the sync engine (and any other
|
|
3
|
+
* caller) sits on. ADR 0013's thesis as an interface: the layer defines,
|
|
4
|
+
* orders, settles, and authorizes changes; it holds no materialised state.
|
|
5
|
+
*
|
|
6
|
+
* `observe()` is the whole seam in one method. The sync engine is `observe()`
|
|
7
|
+
* piped into a materializer — deltas → local store → IndexedDB → reactive
|
|
8
|
+
* re-render — plus local optimistic mutations reconciled against `commit()` /
|
|
9
|
+
* `settled()`. Everything reactive is downstream of that method; the
|
|
10
|
+
* transaction layer never calls up into it.
|
|
11
|
+
*
|
|
12
|
+
* `participant` stays the WHO (user | agent | system), never the name of this.
|
|
13
|
+
* The taught verbs map onto the seam directly: `create`/`update`/`delete` are
|
|
14
|
+
* operations inside a `commit()` payload; `claim` is `claim()`; `track` rides
|
|
15
|
+
* the commit payload's `track` field (a durable premise is a zero-operation
|
|
16
|
+
* commit). Presence (`join`) is deliberately absent: it is live observation
|
|
17
|
+
* over a socket, and it joins the seam when its core carrier type exists —
|
|
18
|
+
* see docs/plans/transaction-core-language.md, Tier 3.
|
|
19
|
+
*
|
|
20
|
+
* This is the contract, not a runtime: nothing in this package implements it
|
|
21
|
+
* yet. The first explicit implementation (a headless client, a test harness)
|
|
22
|
+
* gains a compile-time conformance pin against this interface.
|
|
23
|
+
*/
|
|
24
|
+
export {};
|
|
@@ -91,12 +91,11 @@ export declare const durableCommitEnvelopeSchema: z.ZodObject<{
|
|
|
91
91
|
}, z.core.$strip>>;
|
|
92
92
|
sourceMutationIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
93
93
|
commitOptions: z.ZodDefault<z.ZodObject<{
|
|
94
|
-
causedByTaskId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
95
94
|
reads: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
96
95
|
model: z.ZodString;
|
|
97
96
|
id: z.ZodString;
|
|
98
97
|
readAt: z.ZodNumber;
|
|
99
|
-
fields: z.ZodOptional<z.ZodArray<z.ZodString
|
|
98
|
+
fields: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
|
|
100
99
|
onStale: z.ZodOptional<z.ZodEnum<{
|
|
101
100
|
reject: "reject";
|
|
102
101
|
overwrite: "overwrite";
|
|
@@ -112,8 +111,8 @@ export declare const durableCommitEnvelopeSchema: z.ZodObject<{
|
|
|
112
111
|
}>>;
|
|
113
112
|
}, z.core.$strip>]>>>>;
|
|
114
113
|
track: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
115
|
-
model: z.ZodString;
|
|
116
114
|
id: z.ZodString;
|
|
115
|
+
model: z.ZodString;
|
|
117
116
|
readAt: z.ZodOptional<z.ZodNumber>;
|
|
118
117
|
}, z.core.$strip>, z.ZodObject<{
|
|
119
118
|
group: z.ZodString;
|
|
@@ -137,8 +136,8 @@ export declare function commitEnvelopeRecordId(idempotencyKey: string): string;
|
|
|
137
136
|
/** Constructs validated member metadata when an in-memory batch is formed. */
|
|
138
137
|
export declare function createCommitEnvelopeMember(value: z.input<typeof commitEnvelopeMemberSchema>): CommitEnvelopeMember;
|
|
139
138
|
/**
|
|
140
|
-
* Freezes the exact JSON request that will be persisted and sent. The
|
|
141
|
-
*
|
|
142
|
-
*
|
|
139
|
+
* Freezes the exact JSON request that will be persisted and sent. The shared
|
|
140
|
+
* snapshot contract makes framework proxies plain and rejects values that
|
|
141
|
+
* would be lost or corrupted by JSON serialization.
|
|
143
142
|
*/
|
|
144
143
|
export declare function createDurableCommitEnvelope(value: Omit<z.input<typeof durableCommitEnvelopeSchema>, 'id' | 'type' | 'storageVersion' | 'timestamp'>): DurableCommitEnvelope;
|