@abloatai/ablo 0.25.0 → 0.27.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 +5 -3
- package/CHANGELOG.md +34 -0
- package/README.md +104 -88
- package/dist/BaseSyncedStore.d.ts +140 -266
- package/dist/BaseSyncedStore.js +338 -739
- package/dist/Database.d.ts +62 -77
- package/dist/Database.js +106 -127
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +16 -15
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +52 -69
- package/dist/ModelRegistry.d.ts +46 -25
- package/dist/ModelRegistry.js +32 -30
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +6 -7
- package/dist/SyncClient.d.ts +119 -109
- package/dist/SyncClient.js +303 -224
- package/dist/SyncEngineContext.d.ts +1 -3
- package/dist/SyncEngineContext.js +1 -2
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +39 -31
- package/dist/agent/Agent.js +35 -23
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +7 -8
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/credentialPolicy.d.ts +74 -71
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +7 -18
- package/dist/auth/credentialSource.js +10 -18
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +34 -40
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +483 -369
- package/dist/client/Ablo.d.ts +107 -836
- package/dist/client/Ablo.js +174 -833
- package/dist/client/ApiClient.d.ts +44 -20
- package/dist/client/ApiClient.js +193 -44
- package/dist/client/auth.d.ts +51 -60
- package/dist/client/auth.js +137 -110
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +35 -0
- package/dist/client/consoleLogger.js +44 -0
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +158 -124
- package/dist/client/credentialEndpoint.d.ts +61 -0
- package/dist/client/credentialEndpoint.js +86 -0
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +21 -0
- package/dist/client/hostedEndpoints.js +21 -0
- package/dist/client/httpClient.d.ts +58 -54
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +49 -59
- package/dist/client/modelRegistration.d.ts +10 -0
- package/dist/client/modelRegistration.js +301 -0
- package/dist/client/options.d.ts +373 -0
- package/dist/client/options.js +6 -0
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +333 -0
- package/dist/client/resourceTypes.js +7 -0
- package/dist/client/schemaConfig.d.ts +44 -0
- package/dist/client/schemaConfig.js +176 -0
- package/dist/client/sessionMint.d.ts +17 -13
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +9 -10
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +28 -0
- package/dist/client/wsMutationExecutor.js +71 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -7
- package/dist/coordination/index.d.ts +13 -4
- package/dist/coordination/index.js +29 -4
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -11
- package/dist/coordination/trace.js +13 -15
- package/dist/core/DatabaseManager.d.ts +5 -8
- package/dist/core/DatabaseManager.js +38 -40
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +27 -34
- package/dist/core/QueryView.d.ts +17 -5
- package/dist/core/QueryView.js +6 -7
- package/dist/core/StoreManager.d.ts +14 -16
- package/dist/core/StoreManager.js +26 -25
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +18 -13
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +57 -54
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +145 -0
- package/dist/core/storeContract.js +12 -0
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +118 -101
- package/dist/errorCodes.js +277 -260
- package/dist/errors.d.ts +170 -165
- package/dist/errors.js +161 -151
- package/dist/index.d.ts +30 -27
- package/dist/index.js +90 -82
- package/dist/interfaces/index.d.ts +108 -133
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +59 -49
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +149 -155
- package/dist/mutators/defineMutators.d.ts +24 -37
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +105 -101
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +32 -16
- package/dist/query/client.js +103 -72
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +7 -11
- package/dist/react/AbloProvider.js +24 -17
- package/dist/react/context.d.ts +27 -146
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +17 -15
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +11 -12
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +9 -9
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +10 -4
- package/dist/react/useReactive.js +2 -3
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +3 -3
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +35 -0
- package/dist/schema/ddlLock.js +46 -0
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +36 -49
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +5 -4
- package/dist/schema/index.js +29 -21
- package/dist/schema/model.d.ts +121 -146
- package/dist/schema/model.js +24 -35
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +7 -1
- package/dist/schema/queries.d.ts +30 -32
- package/dist/schema/queries.js +24 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +38 -0
- package/dist/schema/residency.js +30 -0
- package/dist/schema/roles.d.ts +45 -27
- package/dist/schema/roles.js +52 -21
- package/dist/schema/schema.d.ts +36 -45
- package/dist/schema/schema.js +42 -39
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +36 -39
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +31 -26
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +34 -28
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +28 -26
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +10 -9
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +27 -29
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +27 -19
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +30 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +94 -0
- package/dist/source/factory.js +268 -0
- package/dist/source/index.d.ts +10 -462
- package/dist/source/index.js +17 -421
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +10 -11
- package/dist/source/next.js +7 -8
- package/dist/source/pushQueue.d.ts +70 -48
- package/dist/source/pushQueue.js +36 -29
- package/dist/source/signing.d.ts +88 -0
- package/dist/source/signing.js +159 -0
- package/dist/source/types.d.ts +351 -0
- package/dist/source/types.js +43 -0
- package/dist/stores/ObjectStore.d.ts +11 -12
- package/dist/stores/ObjectStore.js +34 -35
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +8 -12
- package/dist/stores/SyncActionStore.js +77 -46
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +28 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
- package/dist/sync/ConnectionManager.d.ts +47 -50
- package/dist/sync/ConnectionManager.js +74 -70
- package/dist/sync/NetworkProbe.d.ts +27 -31
- package/dist/sync/NetworkProbe.js +67 -72
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
- package/dist/sync/SyncWebSocket.d.ts +175 -250
- package/dist/sync/SyncWebSocket.js +431 -769
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +38 -30
- package/dist/sync/bootstrapApply.d.ts +70 -0
- package/dist/sync/bootstrapApply.js +73 -0
- package/dist/sync/commitFrames.d.ts +44 -0
- package/dist/sync/commitFrames.js +94 -0
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +108 -25
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +13 -17
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +175 -0
- package/dist/sync/credentialLifecycle.js +322 -0
- package/dist/sync/deltaPipeline.d.ts +113 -0
- package/dist/sync/deltaPipeline.js +261 -0
- package/dist/sync/groupChange.d.ts +113 -0
- package/dist/sync/groupChange.js +242 -0
- package/dist/sync/heartbeat.d.ts +63 -0
- package/dist/sync/heartbeat.js +91 -0
- package/dist/sync/participants.d.ts +27 -27
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +40 -0
- package/dist/sync/syncCursor.js +55 -0
- package/dist/sync/syncPlan.d.ts +54 -0
- package/dist/sync/syncPlan.js +50 -0
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +116 -0
- package/dist/sync/wsFrameHandlers.js +374 -0
- package/dist/testing/fixtures/bootstrap.d.ts +21 -17
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +31 -34
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +12 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +4 -4
- package/dist/testing/index.js +3 -3
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
- package/dist/testing/mocks/MockSyncContext.js +16 -45
- package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +190 -221
- package/dist/transactions/TransactionQueue.js +424 -822
- package/dist/transactions/TransactionStore.d.ts +20 -0
- package/dist/transactions/TransactionStore.js +53 -0
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +58 -0
- package/dist/transactions/coalesceRules.js +140 -0
- package/dist/transactions/commitPayload.d.ts +130 -0
- package/dist/transactions/commitPayload.js +143 -0
- package/dist/transactions/deltaConfirmation.d.ts +58 -0
- package/dist/transactions/deltaConfirmation.js +215 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +99 -0
- package/dist/transactions/replayValidation.js +111 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +74 -80
- package/dist/types/index.js +22 -27
- package/dist/types/modelData.d.ts +10 -0
- package/dist/types/modelData.js +9 -0
- package/dist/types/participant.d.ts +20 -0
- package/dist/types/participant.js +10 -0
- package/dist/types/streams.d.ts +216 -209
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +35 -27
- package/dist/wire/errorEnvelope.js +38 -32
- package/dist/wire/frames.d.ts +150 -67
- package/dist/wire/frames.js +48 -1
- package/dist/wire/index.d.ts +18 -13
- package/dist/wire/index.js +36 -13
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +38 -0
- package/dist/wire/protocol.js +38 -0
- package/dist/wire/protocolVersion.d.ts +60 -0
- package/dist/wire/protocolVersion.js +67 -0
- package/docs/api-keys.md +4 -3
- package/docs/coordination.md +59 -0
- package/docs/examples/existing-python-backend.md +3 -3
- package/docs/identity.md +4 -4
- package/docs/integration-guide.md +1 -1
- package/docs/react.md +1 -1
- package/docs/sessions.md +5 -7
- package/package.json +24 -21
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/client/index.d.ts +0 -36
- package/dist/client/index.js +0 -33
- package/dist/config/index.d.ts +0 -10
- package/dist/config/index.js +0 -12
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/interfaces/headless.d.ts +0 -95
- package/dist/interfaces/headless.js +0 -41
- package/dist/query/index.d.ts +0 -6
- package/dist/query/index.js +0 -5
- package/dist/realtime/index.d.ts +0 -10
- package/dist/realtime/index.js +0 -9
- package/dist/schema/plane.d.ts +0 -23
- package/dist/schema/plane.js +0 -19
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/next.d.ts +0 -51
- package/dist/server/next.js +0 -47
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -1
- package/dist/server/storage-mode.js +0 -18
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/sync/OfflineFlush.d.ts +0 -9
- package/dist/sync/OfflineFlush.js +0 -22
- package/dist/sync/OfflineTransactionStore.d.ts +0 -37
- package/dist/sync/OfflineTransactionStore.js +0 -263
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/index.d.ts +0 -16
- package/dist/transactions/index.js +0 -7
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/utils/mobx-setup.d.ts +0 -42
|
@@ -1,43 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Schema ⇄ JSON
|
|
2
|
+
* Schema ⇄ JSON.
|
|
3
3
|
*
|
|
4
|
-
* A `Schema` is serializable
|
|
5
|
-
* validators
|
|
6
|
-
* JSON form
|
|
4
|
+
* A `Schema` is fully serializable apart from its client-only closures — the
|
|
5
|
+
* Zod validators and computed getters. {@link serializeSchema} emits the
|
|
6
|
+
* plain-data JSON form and {@link parseSchema} reconstructs a working `Schema`
|
|
7
|
+
* from it: one `Schema` type with two representations.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* is what travels over the control plane (`ablo push`) and is stored
|
|
12
|
-
* per `(tenant, version)`.
|
|
9
|
+
* A hosted, multi-tenant server loads a tenant's schema with `parseSchema(json)`
|
|
10
|
+
* rather than importing it in process. The JSON is what `ablo push` sends and
|
|
11
|
+
* what the server stores per tenant and version.
|
|
13
12
|
*
|
|
14
13
|
* What round-trips:
|
|
15
|
-
* - all model routing
|
|
16
|
-
* mutable, the
|
|
17
|
-
*
|
|
18
|
-
* requiredFields, lazyObservable
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* -
|
|
23
|
-
* -
|
|
24
|
-
* - identity roles (already pure data)
|
|
14
|
+
* - all model routing and scoping metadata: typename, tableName, load,
|
|
15
|
+
* mutable, the `tenancy` descriptor, bootstrap hints, scope, grants,
|
|
16
|
+
* entityRoles, the `conflict` disposition map, persist, autoFill,
|
|
17
|
+
* requiredFields, and lazyObservable. The authoring shorthands (`policy`
|
|
18
|
+
* and `groups`) are normalized into these canonical fields when the model
|
|
19
|
+
* is built, so only the canonical fields cross here.
|
|
20
|
+
* - relations, including the resolved `foreignKeyColumn`
|
|
21
|
+
* - field metadata (names and type tags), from which validators are rebuilt
|
|
22
|
+
* - identity roles
|
|
25
23
|
*
|
|
26
|
-
* What does
|
|
27
|
-
* -
|
|
28
|
-
* - exact Zod refinements
|
|
29
|
-
*
|
|
24
|
+
* What does not round-trip, because the server never needs it:
|
|
25
|
+
* - computed getters, which are closures and are dropped
|
|
26
|
+
* - exact Zod refinements, which are rebuilt as permissive validators from
|
|
27
|
+
* {@link FieldMeta}; the server does no field-shape validation
|
|
30
28
|
*/
|
|
31
29
|
import type { FieldMeta } from './field.js';
|
|
32
30
|
import type { Tenancy } from './tenancy.js';
|
|
33
|
-
import type {
|
|
31
|
+
import type { ModelResidency } from './residency.js';
|
|
34
32
|
import type { GrantsRef, LoadStrategy, PersistOptions, AutoFillRule, ConflictAxis } from './model.js';
|
|
35
33
|
import type { RelationType } from './relation.js';
|
|
36
|
-
import { type Schema, type
|
|
37
|
-
/** Current schema-JSON envelope version. Bump on a breaking change to the
|
|
38
|
-
* JSON shape itself
|
|
39
|
-
* `syncGroupFormat` template string with structured `scope`/`grants`/
|
|
40
|
-
* `entityRoles` (relation-driven sync groups). */
|
|
34
|
+
import { type Schema, type IdentityRole, type EntityRole } from './schema.js';
|
|
35
|
+
/** Current schema-JSON envelope version. Bump this on a breaking change to the
|
|
36
|
+
* JSON shape itself — not to a user's schema. */
|
|
41
37
|
declare const SCHEMA_JSON_VERSION: 3;
|
|
42
38
|
/** A relation in JSON form. Mirrors the serializable members of {@link RelationDef}. */
|
|
43
39
|
export interface RelationJSON {
|
|
@@ -56,14 +52,15 @@ export interface ModelJSON {
|
|
|
56
52
|
readonly typename: string;
|
|
57
53
|
readonly tableName?: string;
|
|
58
54
|
readonly tenancy: Tenancy;
|
|
59
|
-
/**
|
|
60
|
-
*
|
|
61
|
-
|
|
55
|
+
/** The database plane the model's rows live in. Optional for backward
|
|
56
|
+
* compatibility: when absent (an artifact written before this field existed)
|
|
57
|
+
* it reads as `tenant`, the default. See {@link ModelResidency}. */
|
|
58
|
+
readonly plane?: ModelResidency;
|
|
62
59
|
readonly scope?: boolean | string;
|
|
63
60
|
readonly grants?: GrantsRef;
|
|
64
61
|
readonly entityRoles?: readonly EntityRole[];
|
|
65
|
-
/**
|
|
66
|
-
*
|
|
62
|
+
/** The declared write-conflict disposition per committer kind. When absent,
|
|
63
|
+
* the engine falls back to its default. */
|
|
67
64
|
readonly conflict?: ConflictAxis;
|
|
68
65
|
readonly bootstrapLimit?: number;
|
|
69
66
|
readonly bootstrapOrderBy?: string;
|
|
@@ -84,18 +81,18 @@ export interface SchemaJSON {
|
|
|
84
81
|
* (validators, `computed`); keeps everything the server and a faithful
|
|
85
82
|
* rebuild need. The result is plain data — `JSON.stringify`-safe.
|
|
86
83
|
*/
|
|
87
|
-
export declare function toSchemaJSON(schema: Schema
|
|
84
|
+
export declare function toSchemaJSON(schema: Schema): SchemaJSON;
|
|
88
85
|
/** Serialize a `Schema` to a JSON string (the `ablo push` payload). */
|
|
89
|
-
export declare function serializeSchema(schema: Schema
|
|
86
|
+
export declare function serializeSchema(schema: Schema): string;
|
|
90
87
|
/**
|
|
91
88
|
* Reconstruct a working `Schema` from its JSON form. Validators are rebuilt
|
|
92
89
|
* permissively from field metadata (the server never validates field shapes);
|
|
93
90
|
* `computed` getters are absent. Everything the server reads — routing,
|
|
94
91
|
* scoping, relations, identity roles — is restored exactly.
|
|
95
92
|
*/
|
|
96
|
-
export declare function fromSchemaJSON(json: SchemaJSON): Schema
|
|
93
|
+
export declare function fromSchemaJSON(json: SchemaJSON): Schema;
|
|
97
94
|
/** Parse a `Schema` from a JSON string (inverse of {@link serializeSchema}). */
|
|
98
|
-
export declare function parseSchema(json: string): Schema
|
|
95
|
+
export declare function parseSchema(json: string): Schema;
|
|
99
96
|
/**
|
|
100
97
|
* Stable content hash of a `Schema`'s JSON form. FNV-1a over a canonical
|
|
101
98
|
* (sorted-key) encoding — deterministic across runs and order-invariant, no
|
|
@@ -103,5 +100,5 @@ export declare function parseSchema(json: string): Schema<SchemaRecord>;
|
|
|
103
100
|
* the hash it was built against, the server compares it to the tenant's
|
|
104
101
|
* active schema hash. Not a security primitive.
|
|
105
102
|
*/
|
|
106
|
-
export declare function schemaHash(schema: Schema
|
|
103
|
+
export declare function schemaHash(schema: Schema): string;
|
|
107
104
|
export {};
|
package/dist/schema/serialize.js
CHANGED
|
@@ -1,40 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Schema ⇄ JSON
|
|
2
|
+
* Schema ⇄ JSON.
|
|
3
3
|
*
|
|
4
|
-
* A `Schema` is serializable
|
|
5
|
-
* validators
|
|
6
|
-
* JSON form
|
|
4
|
+
* A `Schema` is fully serializable apart from its client-only closures — the
|
|
5
|
+
* Zod validators and computed getters. {@link serializeSchema} emits the
|
|
6
|
+
* plain-data JSON form and {@link parseSchema} reconstructs a working `Schema`
|
|
7
|
+
* from it: one `Schema` type with two representations.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* is what travels over the control plane (`ablo push`) and is stored
|
|
12
|
-
* per `(tenant, version)`.
|
|
9
|
+
* A hosted, multi-tenant server loads a tenant's schema with `parseSchema(json)`
|
|
10
|
+
* rather than importing it in process. The JSON is what `ablo push` sends and
|
|
11
|
+
* what the server stores per tenant and version.
|
|
13
12
|
*
|
|
14
13
|
* What round-trips:
|
|
15
|
-
* - all model routing
|
|
16
|
-
* mutable, the
|
|
17
|
-
*
|
|
18
|
-
* requiredFields, lazyObservable
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* -
|
|
23
|
-
* -
|
|
24
|
-
* - identity roles (already pure data)
|
|
14
|
+
* - all model routing and scoping metadata: typename, tableName, load,
|
|
15
|
+
* mutable, the `tenancy` descriptor, bootstrap hints, scope, grants,
|
|
16
|
+
* entityRoles, the `conflict` disposition map, persist, autoFill,
|
|
17
|
+
* requiredFields, and lazyObservable. The authoring shorthands (`policy`
|
|
18
|
+
* and `groups`) are normalized into these canonical fields when the model
|
|
19
|
+
* is built, so only the canonical fields cross here.
|
|
20
|
+
* - relations, including the resolved `foreignKeyColumn`
|
|
21
|
+
* - field metadata (names and type tags), from which validators are rebuilt
|
|
22
|
+
* - identity roles
|
|
25
23
|
*
|
|
26
|
-
* What does
|
|
27
|
-
* -
|
|
28
|
-
* - exact Zod refinements
|
|
29
|
-
*
|
|
24
|
+
* What does not round-trip, because the server never needs it:
|
|
25
|
+
* - computed getters, which are closures and are dropped
|
|
26
|
+
* - exact Zod refinements, which are rebuilt as permissive validators from
|
|
27
|
+
* {@link FieldMeta}; the server does no field-shape validation
|
|
30
28
|
*/
|
|
31
29
|
import { z } from 'zod';
|
|
32
30
|
import { AbloValidationError } from '../errors.js';
|
|
33
31
|
import { baseFieldsSchema, } from './schema.js';
|
|
34
|
-
/** Current schema-JSON envelope version. Bump on a breaking change to the
|
|
35
|
-
* JSON shape itself
|
|
36
|
-
* `syncGroupFormat` template string with structured `scope`/`grants`/
|
|
37
|
-
* `entityRoles` (relation-driven sync groups). */
|
|
32
|
+
/** Current schema-JSON envelope version. Bump this on a breaking change to the
|
|
33
|
+
* JSON shape itself — not to a user's schema. */
|
|
38
34
|
const SCHEMA_JSON_VERSION = 3;
|
|
39
35
|
// ── Serialize ────────────────────────────────────────────────────────────────
|
|
40
36
|
function relationToJSON(rel) {
|
|
@@ -168,14 +164,14 @@ function modelFromJSON(json) {
|
|
|
168
164
|
persist: json.persist,
|
|
169
165
|
tableName: json.tableName,
|
|
170
166
|
tenancy: json.tenancy,
|
|
171
|
-
// Absent in
|
|
172
|
-
//
|
|
167
|
+
// Absent in older artifacts → default `tenant`, matching the model builder
|
|
168
|
+
// and provisioning defaults so the round-trip stays stable.
|
|
173
169
|
plane: json.plane ?? 'tenant',
|
|
174
170
|
scope: json.scope,
|
|
175
171
|
grants: json.grants,
|
|
176
172
|
entityRoles: json.entityRoles,
|
|
177
|
-
//
|
|
178
|
-
// the
|
|
173
|
+
// Absent in older artifacts → undefined, so the commit path falls through to
|
|
174
|
+
// the function registry or the engine default.
|
|
179
175
|
conflict: json.conflict,
|
|
180
176
|
mutable: json.mutable,
|
|
181
177
|
lazyObservable: json.lazyObservable,
|
package/dist/schema/sugar.d.ts
CHANGED
|
@@ -1,35 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* A concise, claim-first way to declare a model. Each verb is shorthand for a
|
|
3
|
+
* {@link model} call with two decisions already made, so a reader learns the two
|
|
4
|
+
* facts that matter most about an entity before scanning its fields:
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
+
* - Writability: `mutable.*` lets clients send create, update, and delete
|
|
7
|
+
* operations over the commit protocol. `readOnly.*` means the server owns the
|
|
8
|
+
* model — its changes stream to clients as deltas, but clients cannot mutate it.
|
|
9
|
+
* - Load strategy: `.instant` loads the model at bootstrap, `.lazy` loads it on
|
|
10
|
+
* first access, and `.manual` loads it only when you query it explicitly.
|
|
6
11
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* to clients but clients cannot mutate.
|
|
11
|
-
* - **Load strategy** (axis 2): `.instant` loads at bootstrap,
|
|
12
|
-
* `.lazy` loads on first access, `.manual` requires explicit
|
|
13
|
-
* queries.
|
|
12
|
+
* The two-token form (`mutable.lazy({...})`) states the safety claim in the first
|
|
13
|
+
* token and the load shape in the second. The plain {@link model} factory remains
|
|
14
|
+
* available; these verbs are a convenience layered over it.
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
* in the first token and the load shape in the second — you know both
|
|
17
|
-
* key facts about the entity before scanning its fields.
|
|
18
|
-
*
|
|
19
|
-
* This is additive: the original `model(...)` factory keeps working.
|
|
20
|
-
* New entities should prefer the verbs; existing entities can migrate
|
|
21
|
-
* entity-by-entity.
|
|
22
|
-
*
|
|
23
|
-
* Example:
|
|
16
|
+
* @example
|
|
24
17
|
* ```ts
|
|
25
|
-
* // Before — 7 options to read before the fields make sense
|
|
26
|
-
* tasks: model({ title: z.string() }, { ... }, {
|
|
27
|
-
* typename: 'Task', tableName: 'tasks', mutable: true,
|
|
28
|
-
* load: 'lazy', lazyObservable: true, computed: tasksComputed,
|
|
29
|
-
* }),
|
|
30
|
-
*
|
|
31
|
-
* // After — claim reads off the verb; options carry only the
|
|
32
|
-
* // fields that actually diverge from defaults
|
|
33
18
|
* tasks: mutable.lazy({ title: z.string() }, {
|
|
34
19
|
* typename: 'Task', tableName: 'tasks',
|
|
35
20
|
* relations: { ... },
|
|
@@ -57,14 +42,14 @@ export interface SugarOptions<R extends RelationRecord = RelationRecord, C exten
|
|
|
57
42
|
*/
|
|
58
43
|
typename?: string;
|
|
59
44
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* `'member'`
|
|
45
|
+
* The physical table name. Override it when the table name differs from the
|
|
46
|
+
* snake_case of the typename — for example, a `Member` type stored in a table
|
|
47
|
+
* named `'member'` rather than `'members'`.
|
|
63
48
|
*/
|
|
64
49
|
tableName?: string;
|
|
65
50
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
51
|
+
* The row-access policy for tenant isolation — the rule deciding who may read a
|
|
52
|
+
* row. A discriminated union on `by` (`column`, `parent`, or `none`). See
|
|
68
53
|
* {@link ModelOptions.policy}.
|
|
69
54
|
*/
|
|
70
55
|
policy?: ModelOptions['policy'];
|
package/dist/schema/sugar.js
CHANGED
|
@@ -1,35 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* A concise, claim-first way to declare a model. Each verb is shorthand for a
|
|
3
|
+
* {@link model} call with two decisions already made, so a reader learns the two
|
|
4
|
+
* facts that matter most about an entity before scanning its fields:
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
+
* - Writability: `mutable.*` lets clients send create, update, and delete
|
|
7
|
+
* operations over the commit protocol. `readOnly.*` means the server owns the
|
|
8
|
+
* model — its changes stream to clients as deltas, but clients cannot mutate it.
|
|
9
|
+
* - Load strategy: `.instant` loads the model at bootstrap, `.lazy` loads it on
|
|
10
|
+
* first access, and `.manual` loads it only when you query it explicitly.
|
|
6
11
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* to clients but clients cannot mutate.
|
|
11
|
-
* - **Load strategy** (axis 2): `.instant` loads at bootstrap,
|
|
12
|
-
* `.lazy` loads on first access, `.manual` requires explicit
|
|
13
|
-
* queries.
|
|
12
|
+
* The two-token form (`mutable.lazy({...})`) states the safety claim in the first
|
|
13
|
+
* token and the load shape in the second. The plain {@link model} factory remains
|
|
14
|
+
* available; these verbs are a convenience layered over it.
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
* in the first token and the load shape in the second — you know both
|
|
17
|
-
* key facts about the entity before scanning its fields.
|
|
18
|
-
*
|
|
19
|
-
* This is additive: the original `model(...)` factory keeps working.
|
|
20
|
-
* New entities should prefer the verbs; existing entities can migrate
|
|
21
|
-
* entity-by-entity.
|
|
22
|
-
*
|
|
23
|
-
* Example:
|
|
16
|
+
* @example
|
|
24
17
|
* ```ts
|
|
25
|
-
* // Before — 7 options to read before the fields make sense
|
|
26
|
-
* tasks: model({ title: z.string() }, { ... }, {
|
|
27
|
-
* typename: 'Task', tableName: 'tasks', mutable: true,
|
|
28
|
-
* load: 'lazy', lazyObservable: true, computed: tasksComputed,
|
|
29
|
-
* }),
|
|
30
|
-
*
|
|
31
|
-
* // After — claim reads off the verb; options carry only the
|
|
32
|
-
* // fields that actually diverge from defaults
|
|
33
18
|
* tasks: mutable.lazy({ title: z.string() }, {
|
|
34
19
|
* typename: 'Task', tableName: 'tasks',
|
|
35
20
|
* relations: { ... },
|
|
@@ -86,8 +71,8 @@ export const mutable = {
|
|
|
86
71
|
*/
|
|
87
72
|
export const readOnly = {
|
|
88
73
|
instant: (shape, opts) =>
|
|
89
|
-
// Reactive by default
|
|
90
|
-
//
|
|
74
|
+
// Reactive by default, like every variant: a remote delta that mutates a row
|
|
75
|
+
// in place must re-render reactive reads. Opt out per-model with
|
|
91
76
|
// `lazyObservable: false` for very large read-only lists where per-field
|
|
92
77
|
// atoms cost more than the QueryView's entry-replaced reactivity.
|
|
93
78
|
build(shape, opts, { mutable: false, load: 'instant', lazyObservable: true }),
|
|
@@ -1,48 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Zod schemas that describe the `sync_deltas` storage row — the durable record of
|
|
3
|
+
* one committed change. The row is split into three slices by the concern each one
|
|
4
|
+
* serves:
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* - {@link syncDeltaCoreSchema} — the sync-protocol slice: everything a client
|
|
7
|
+
* needs to reconstruct the change, plus the tenant key. This is the portable
|
|
8
|
+
* part, and the only part written atomically with the application row.
|
|
9
|
+
* - {@link deltaAttributionSchema} — who made the change, and on whose authority.
|
|
10
|
+
* - {@link deltaProvenanceSchema} — which AI task, if any, produced it.
|
|
10
11
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* a BYO outbox marker carries (the portable
|
|
15
|
-
* slice).
|
|
16
|
-
* - {@link deltaAttributionSchema} — who / on whose authority. `control` plane.
|
|
17
|
-
* - {@link deltaProvenanceSchema} — which AI task caused it. `control` plane.
|
|
12
|
+
* {@link syncDeltaRowSchema} composes all three into the full stored row.
|
|
13
|
+
* {@link DELTA_RESIDENCY} records which database each slice lives in, so
|
|
14
|
+
* provisioning can derive that boundary from the schema instead of hand-coding it.
|
|
18
15
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* Distinct from the WIRE `SyncDelta` (`sync/SyncWebSocket.ts`, client-facing) and
|
|
24
|
-
* `SourceDelta` (`source/index.ts`, source-mode input) — those are projections of
|
|
25
|
-
* this row. Field names mirror those + `AuditChainRow` (`@ablo/audit-chain`).
|
|
26
|
-
*
|
|
27
|
-
* Monorepo is on Zod v4 — `.extend(...).shape` (not deprecated `.merge`).
|
|
16
|
+
* This is the stored shape. The delta broadcast to clients is a narrower projection
|
|
17
|
+
* of it — see {@link import('../wire/delta.js').syncDeltaWireCoreSchema} — and
|
|
18
|
+
* the field names here mirror those on that wire delta.
|
|
28
19
|
*/
|
|
29
20
|
import { z } from 'zod';
|
|
30
|
-
|
|
31
|
-
export
|
|
32
|
-
user: "user";
|
|
33
|
-
agent: "agent";
|
|
34
|
-
system: "system";
|
|
35
|
-
}>;
|
|
36
|
-
export type ParticipantKind = z.infer<typeof participantKindSchema>;
|
|
37
|
-
/** `confirmation_state` */
|
|
38
|
-
export declare const confirmationStateSchema: z.ZodEnum<{
|
|
39
|
-
auto: "auto";
|
|
40
|
-
previewed: "previewed";
|
|
41
|
-
approved: "approved";
|
|
42
|
-
required_human_approval: "required_human_approval";
|
|
43
|
-
auto_historical: "auto_historical";
|
|
44
|
-
}>;
|
|
45
|
-
export type ConfirmationState = z.infer<typeof confirmationStateSchema>;
|
|
21
|
+
export { participantKindSchema, confirmationStateSchema } from '../wire/delta.js';
|
|
22
|
+
export type { ParticipantKind, ConfirmationState } from '../wire/delta.js';
|
|
46
23
|
/** `backfill_provenance` */
|
|
47
24
|
export declare const backfillProvenanceSchema: z.ZodEnum<{
|
|
48
25
|
unknown: "unknown";
|
|
@@ -51,11 +28,11 @@ export declare const backfillProvenanceSchema: z.ZodEnum<{
|
|
|
51
28
|
}>;
|
|
52
29
|
export type BackfillProvenance = z.infer<typeof backfillProvenanceSchema>;
|
|
53
30
|
/**
|
|
54
|
-
* Everything a client needs to materialize the change, plus the tenant key.
|
|
55
|
-
* portable slice: the only part written atomically with the
|
|
56
|
-
* shape
|
|
57
|
-
*
|
|
58
|
-
* outbox marker
|
|
31
|
+
* Everything a client needs to materialize the change, plus the tenant key. This
|
|
32
|
+
* is the portable slice: the only part written atomically with the application
|
|
33
|
+
* row, and the shape an outbox marker in a customer's own database carries. `id`,
|
|
34
|
+
* `createdAt`, and `syncGroups` are assigned by the server when the delta is
|
|
35
|
+
* appended, so they are optional here — an outbox marker does not have them yet.
|
|
59
36
|
*/
|
|
60
37
|
export declare const syncDeltaCoreSchema: z.ZodObject<{
|
|
61
38
|
id: z.ZodOptional<z.ZodUnion<readonly [z.ZodBigInt, z.ZodNumber]>>;
|
|
@@ -104,7 +81,7 @@ export declare const deltaProvenanceSchema: z.ZodObject<{
|
|
|
104
81
|
causedByTaskId: z.ZodNullable<z.ZodString>;
|
|
105
82
|
}, z.core.$strip>;
|
|
106
83
|
export type DeltaProvenance = z.infer<typeof deltaProvenanceSchema>;
|
|
107
|
-
/** The complete `sync_deltas` row
|
|
84
|
+
/** The complete `sync_deltas` row: core, attribution, and provenance combined. */
|
|
108
85
|
export declare const syncDeltaRowSchema: z.ZodObject<{
|
|
109
86
|
id: z.ZodOptional<z.ZodUnion<readonly [z.ZodBigInt, z.ZodNumber]>>;
|
|
110
87
|
actionType: z.ZodString;
|
|
@@ -147,12 +124,12 @@ export declare const syncDeltaRowSchema: z.ZodObject<{
|
|
|
147
124
|
}, z.core.$strip>;
|
|
148
125
|
export type SyncDeltaRow = z.infer<typeof syncDeltaRowSchema>;
|
|
149
126
|
/**
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
127
|
+
* Maps each slice to the database it belongs in. A customer's own database holds
|
|
128
|
+
* only the `tenant` slice; the `control` slices are enriched and stored in the
|
|
129
|
+
* host's own database. Provisioning reads this map to decide which columns a given
|
|
130
|
+
* database receives, rather than hand-coding the boundary.
|
|
154
131
|
*/
|
|
155
|
-
export declare const
|
|
132
|
+
export declare const DELTA_RESIDENCY: {
|
|
156
133
|
readonly core: "tenant";
|
|
157
134
|
readonly attribution: "control";
|
|
158
135
|
readonly provenance: "control";
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas that describe the `sync_deltas` storage row — the durable record of
|
|
3
|
+
* one committed change. The row is split into three slices by the concern each one
|
|
4
|
+
* serves:
|
|
5
|
+
*
|
|
6
|
+
* - {@link syncDeltaCoreSchema} — the sync-protocol slice: everything a client
|
|
7
|
+
* needs to reconstruct the change, plus the tenant key. This is the portable
|
|
8
|
+
* part, and the only part written atomically with the application row.
|
|
9
|
+
* - {@link deltaAttributionSchema} — who made the change, and on whose authority.
|
|
10
|
+
* - {@link deltaProvenanceSchema} — which AI task, if any, produced it.
|
|
11
|
+
*
|
|
12
|
+
* {@link syncDeltaRowSchema} composes all three into the full stored row.
|
|
13
|
+
* {@link DELTA_RESIDENCY} records which database each slice lives in, so
|
|
14
|
+
* provisioning can derive that boundary from the schema instead of hand-coding it.
|
|
15
|
+
*
|
|
16
|
+
* This is the stored shape. The delta broadcast to clients is a narrower projection
|
|
17
|
+
* of it — see {@link import('../wire/delta.js').syncDeltaWireCoreSchema} — and
|
|
18
|
+
* the field names here mirror those on that wire delta.
|
|
19
|
+
*/
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
import { participantKindSchema, confirmationStateSchema } from '../wire/delta.js';
|
|
22
|
+
// ── Enumerations that mirror the corresponding Postgres enum types ────────────
|
|
23
|
+
// `participant_kind` and `confirmation_state` are shared with the wire delta and
|
|
24
|
+
// live at the wire layer (see `../wire/delta.js`); they are re-exported here so
|
|
25
|
+
// code that imports them from `schema` keeps resolving.
|
|
26
|
+
export { participantKindSchema, confirmationStateSchema } from '../wire/delta.js';
|
|
27
|
+
/** `backfill_provenance` */
|
|
28
|
+
export const backfillProvenanceSchema = z.enum(['exact', 'inferred', 'unknown']);
|
|
29
|
+
/** A delta payload: the full post-mutation row (or null for deletes). */
|
|
30
|
+
const deltaDataSchema = z.record(z.string(), z.unknown()).nullable();
|
|
31
|
+
// ── Core — the sync-protocol slice ────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Everything a client needs to materialize the change, plus the tenant key. This
|
|
34
|
+
* is the portable slice: the only part written atomically with the application
|
|
35
|
+
* row, and the shape an outbox marker in a customer's own database carries. `id`,
|
|
36
|
+
* `createdAt`, and `syncGroups` are assigned by the server when the delta is
|
|
37
|
+
* appended, so they are optional here — an outbox marker does not have them yet.
|
|
38
|
+
*/
|
|
39
|
+
export const syncDeltaCoreSchema = z.object({
|
|
40
|
+
/** Monotonically increasing sync id, assigned by the server when the delta is appended; absent on an outbox marker. */
|
|
41
|
+
id: z.union([z.bigint(), z.number()]).optional(),
|
|
42
|
+
/** The `action_type` column: a single character, `I` (insert), `U` (update), or `D` (delete). */
|
|
43
|
+
actionType: z.string().min(1).max(1),
|
|
44
|
+
modelName: z.string().min(1),
|
|
45
|
+
modelId: z.string().min(1),
|
|
46
|
+
data: deltaDataSchema,
|
|
47
|
+
previousData: deltaDataSchema.optional(),
|
|
48
|
+
/** Routing keys that decide which subscribers receive this delta; computed by the server at append time. */
|
|
49
|
+
syncGroups: z.array(z.string()).optional(),
|
|
50
|
+
/** The committing organization id — the coarse-grained tenant-isolation boundary. */
|
|
51
|
+
organizationId: z.string().nullable(),
|
|
52
|
+
/** ISO 8601 timestamp, assigned by the server when the delta is appended. */
|
|
53
|
+
createdAt: z.string().optional(),
|
|
54
|
+
transactionId: z.string().nullable(),
|
|
55
|
+
});
|
|
56
|
+
// ── Attribution — who made the change, and on whose authority ─────────────────
|
|
57
|
+
export const deltaAttributionSchema = z.object({
|
|
58
|
+
/** The acting participant, recorded as a single column for compatibility; the structured pair below is the richer form. */
|
|
59
|
+
createdBy: z.string().nullable(),
|
|
60
|
+
actorId: z.string().nullable(),
|
|
61
|
+
actorKind: participantKindSchema.nullable(),
|
|
62
|
+
onBehalfOfId: z.string().nullable(),
|
|
63
|
+
onBehalfOfKind: participantKindSchema.nullable(),
|
|
64
|
+
capabilityId: z.string().nullable(),
|
|
65
|
+
delegationChainRootUserId: z.string().nullable().optional(),
|
|
66
|
+
confirmationState: confirmationStateSchema.nullable(),
|
|
67
|
+
backfillProvenance: backfillProvenanceSchema.nullable(),
|
|
68
|
+
});
|
|
69
|
+
// ── Provenance — which AI task produced the change ────────────────────────────
|
|
70
|
+
export const deltaProvenanceSchema = z.object({
|
|
71
|
+
/** Foreign key to the task record for the AI turn that produced this commit; null when no task applies. */
|
|
72
|
+
causedByTaskId: z.string().nullable(),
|
|
73
|
+
});
|
|
74
|
+
// ── Full stored row and its residency map ─────────────────────────────────────
|
|
75
|
+
/** The complete `sync_deltas` row: core, attribution, and provenance combined. */
|
|
76
|
+
export const syncDeltaRowSchema = syncDeltaCoreSchema
|
|
77
|
+
.extend(deltaAttributionSchema.shape)
|
|
78
|
+
.extend(deltaProvenanceSchema.shape);
|
|
79
|
+
/**
|
|
80
|
+
* Maps each slice to the database it belongs in. A customer's own database holds
|
|
81
|
+
* only the `tenant` slice; the `control` slices are enriched and stored in the
|
|
82
|
+
* host's own database. Provisioning reads this map to decide which columns a given
|
|
83
|
+
* database receives, rather than hand-coding the boundary.
|
|
84
|
+
*/
|
|
85
|
+
export const DELTA_RESIDENCY = {
|
|
86
|
+
core: 'tenant',
|
|
87
|
+
attribution: 'control',
|
|
88
|
+
provenance: 'control',
|
|
89
|
+
};
|