@abloatai/ablo 0.26.0 → 0.28.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/CHANGELOG.md +42 -2
- package/README.md +102 -86
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +134 -151
- package/dist/Database.d.ts +68 -69
- package/dist/Database.js +316 -135
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +12 -16
- package/dist/Model.d.ts +54 -52
- package/dist/Model.js +78 -62
- package/dist/ModelRegistry.d.ts +21 -19
- package/dist/ModelRegistry.js +23 -27
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +5 -6
- package/dist/SyncClient.d.ts +122 -118
- package/dist/SyncClient.js +541 -245
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +10 -9
- package/dist/adapters/inMemoryStorage.js +21 -9
- package/dist/agent/Agent.d.ts +27 -32
- package/dist/agent/Agent.js +18 -19
- 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} +26 -33
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +6 -7
- package/dist/ai-sdk/wrap.js +1 -1
- package/dist/auth/credentialPolicy.d.ts +69 -74
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +6 -5
- package/dist/auth/credentialSource.js +9 -10
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +31 -37
- 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 +173 -121
- package/dist/client/Ablo.d.ts +97 -74
- package/dist/client/Ablo.js +129 -163
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +442 -81
- package/dist/client/auth.d.ts +47 -47
- package/dist/client/auth.js +108 -117
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +5 -6
- package/dist/client/consoleLogger.js +5 -6
- package/dist/client/createInternalComponents.d.ts +16 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +152 -122
- package/dist/client/credentialEndpoint.d.ts +40 -42
- package/dist/client/credentialEndpoint.js +35 -36
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +9 -12
- package/dist/client/hostedEndpoints.js +9 -12
- package/dist/client/httpClient.d.ts +59 -53
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +47 -58
- package/dist/client/modelRegistration.d.ts +5 -9
- package/dist/client/modelRegistration.js +78 -87
- package/dist/client/options.d.ts +157 -157
- package/dist/client/options.js +3 -7
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +64 -75
- package/dist/client/resourceTypes.js +4 -10
- package/dist/client/schemaConfig.d.ts +31 -43
- package/dist/client/schemaConfig.js +38 -50
- package/dist/client/sessionMint.d.ts +16 -12
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +8 -9
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +16 -20
- package/dist/client/wsMutationExecutor.js +18 -23
- package/dist/commit/contract.d.ts +493 -0
- package/dist/commit/contract.js +187 -0
- package/dist/commit/index.d.ts +6 -0
- package/dist/commit/index.js +5 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -4
- package/dist/coordination/index.d.ts +10 -8
- package/dist/coordination/index.js +14 -12
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -10
- package/dist/coordination/trace.js +13 -14
- package/dist/core/DatabaseManager.d.ts +5 -7
- package/dist/core/DatabaseManager.js +15 -19
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +22 -28
- package/dist/core/QueryView.d.ts +8 -8
- package/dist/core/QueryView.js +2 -2
- package/dist/core/StoreManager.d.ts +14 -14
- package/dist/core/StoreManager.js +33 -24
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +17 -12
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +42 -43
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +63 -61
- package/dist/core/storeContract.js +8 -12
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +107 -99
- package/dist/errorCodes.js +137 -134
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +36 -27
- package/dist/index.js +91 -86
- package/dist/interfaces/index.d.ts +102 -113
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +41 -40
- 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 +124 -131
- package/dist/mutators/UndoManager.js +177 -156
- package/dist/mutators/defineMutators.d.ts +23 -34
- 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 +104 -100
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +28 -23
- package/dist/query/client.js +45 -43
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +1 -1
- package/dist/react/AbloProvider.js +2 -2
- package/dist/react/context.d.ts +25 -28
- 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 +28 -25
- package/dist/react/useAblo.js +41 -17
- 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 +10 -11
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +8 -8
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useReactive.js +2 -2
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +1 -1
- 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 +20 -24
- package/dist/schema/ddlLock.js +18 -23
- 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 +35 -48
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +3 -3
- package/dist/schema/index.js +21 -23
- package/dist/schema/model.d.ts +118 -143
- package/dist/schema/model.js +22 -33
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +5 -3
- package/dist/schema/queries.d.ts +29 -31
- package/dist/schema/queries.js +23 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +16 -13
- package/dist/schema/residency.js +16 -13
- package/dist/schema/roles.d.ts +36 -43
- package/dist/schema/roles.js +31 -37
- package/dist/schema/schema.d.ts +64 -43
- package/dist/schema/schema.js +31 -32
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +28 -31
- 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} +26 -49
- 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 +30 -25
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +30 -25
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +24 -23
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +9 -8
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +22 -25
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +17 -11
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +28 -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 +46 -58
- package/dist/source/factory.js +22 -27
- package/dist/source/index.d.ts +7 -9
- package/dist/source/index.js +12 -14
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +9 -10
- package/dist/source/next.js +6 -7
- package/dist/source/pushQueue.d.ts +69 -47
- package/dist/source/pushQueue.js +32 -28
- package/dist/source/signing.d.ts +46 -17
- package/dist/source/signing.js +28 -11
- package/dist/source/types.d.ts +121 -104
- package/dist/source/types.js +13 -14
- package/dist/stores/ObjectStore.d.ts +24 -12
- package/dist/stores/ObjectStore.js +38 -16
- package/dist/stores/ObjectStoreContract.d.ts +14 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +29 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
- package/dist/sync/ConnectionManager.d.ts +39 -50
- package/dist/sync/ConnectionManager.js +55 -66
- package/dist/sync/NetworkProbe.d.ts +24 -29
- package/dist/sync/NetworkProbe.js +63 -69
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
- package/dist/sync/SyncWebSocket.d.ts +141 -166
- package/dist/sync/SyncWebSocket.js +191 -223
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +11 -11
- package/dist/sync/bootstrapApply.d.ts +34 -24
- package/dist/sync/bootstrapApply.js +27 -19
- package/dist/sync/commitFrames.d.ts +21 -20
- package/dist/sync/commitFrames.js +18 -18
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +105 -23
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +12 -14
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +104 -104
- package/dist/sync/credentialLifecycle.js +140 -147
- package/dist/sync/deltaPipeline.d.ts +36 -34
- package/dist/sync/deltaPipeline.js +64 -65
- package/dist/sync/groupChange.d.ts +63 -61
- package/dist/sync/groupChange.js +74 -78
- package/dist/sync/heartbeat.d.ts +34 -33
- package/dist/sync/heartbeat.js +31 -31
- package/dist/sync/participants.d.ts +19 -19
- package/dist/sync/persistedPrefix.d.ts +12 -0
- package/dist/sync/persistedPrefix.js +22 -0
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +17 -21
- package/dist/sync/syncCursor.js +17 -21
- package/dist/sync/syncPlan.d.ts +28 -36
- package/dist/sync/syncPlan.js +18 -19
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +35 -36
- package/dist/sync/wsFrameHandlers.js +63 -67
- package/dist/testing/fixtures/bootstrap.d.ts +12 -6
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +30 -33
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +11 -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 -15
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +5 -3
- package/dist/testing/index.js +3 -2
- package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
- package/dist/testing/mocks/FakeDatabase.js +10 -0
- 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 +20 -17
- package/dist/testing/mocks/MockSyncContext.js +15 -13
- package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -23
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +244 -181
- package/dist/transactions/TransactionQueue.js +929 -423
- package/dist/transactions/TransactionStore.d.ts +6 -4
- package/dist/transactions/TransactionStore.js +6 -4
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +41 -17
- package/dist/transactions/coalesceRules.js +40 -17
- package/dist/transactions/commitEnvelope.d.ts +132 -0
- package/dist/transactions/commitEnvelope.js +139 -0
- package/dist/transactions/commitOutboxStore.d.ts +32 -0
- package/dist/transactions/commitOutboxStore.js +26 -0
- package/dist/transactions/commitPayload.d.ts +63 -52
- package/dist/transactions/commitPayload.js +54 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
- package/dist/transactions/httpCommitEnvelope.js +179 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +182 -0
- package/dist/transactions/replayValidation.js +156 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +71 -77
- package/dist/types/index.js +22 -22
- package/dist/types/modelData.d.ts +6 -8
- package/dist/types/modelData.js +5 -7
- package/dist/types/participant.d.ts +10 -11
- package/dist/types/participant.js +6 -8
- package/dist/types/streams.d.ts +208 -195
- 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} +42 -98
- 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/wire/bootstrapReason.d.ts +9 -0
- package/dist/wire/bootstrapReason.js +8 -0
- 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 +30 -31
- package/dist/wire/errorEnvelope.js +34 -40
- package/dist/wire/frames.d.ts +315 -86
- package/dist/wire/frames.js +47 -33
- package/dist/wire/index.d.ts +18 -14
- package/dist/wire/index.js +32 -27
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +25 -32
- package/dist/wire/protocol.js +25 -32
- package/dist/wire/protocolVersion.d.ts +44 -40
- package/dist/wire/protocolVersion.js +44 -40
- package/docs/api.md +10 -10
- package/docs/coordination.md +59 -0
- package/docs/mcp.md +1 -1
- package/package.json +17 -11
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- 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 -8
- package/dist/server/storage-mode.js +0 -28
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/transactions/optimistic.d.ts +0 -24
- package/dist/transactions/optimistic.js +0 -45
- package/dist/transactions/persistedReplay.d.ts +0 -93
- package/dist/transactions/persistedReplay.js +0 -105
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/wire/frames.d.ts
CHANGED
|
@@ -1,30 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The write-path message shapes for the sync protocol. These cover the frames
|
|
3
|
+
* a client sends to commit work — {@link CommitMessage} (a batch of raw
|
|
4
|
+
* operations) and {@link MutationMessage} (a single named mutation) — and the
|
|
5
|
+
* server's {@link MutationResultMessage} acknowledgement. The same frames flow
|
|
6
|
+
* over a WebSocket connection and over the HTTP commit endpoint.
|
|
3
7
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* any
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* Scope note: the delta/sync frames (`sync_response`, `delta`) are NOT
|
|
12
|
-
* here yet — they reference `SyncDelta`, which currently has two
|
|
13
|
-
* definitions (server `db/deltas` vs package `core`) pending unification.
|
|
14
|
-
* They stay server-local until that lands. Everything in this file
|
|
15
|
-
* depends only on package-canonical types (`OnStaleMode`, `ErrorCode`,
|
|
16
|
-
* `RequiredCapability`), so it is safe to share today.
|
|
17
|
-
*
|
|
18
|
-
* Changing any shape here is a wire-contract change — it requires
|
|
19
|
-
* coordinated client + server updates.
|
|
8
|
+
* Both the client and the server import these definitions from here, so the two
|
|
9
|
+
* sides cannot drift. Each interface is paired with a Zod validator
|
|
10
|
+
* ({@link commitOperationSchema}, {@link commitPayloadSchema}) pinned to it at
|
|
11
|
+
* compile time, so the runtime check and the type stay in lockstep. Changing
|
|
12
|
+
* any shape in this file changes the wire contract and requires the client and
|
|
13
|
+
* server to update together.
|
|
20
14
|
*/
|
|
21
15
|
import { z } from 'zod';
|
|
22
16
|
import type { OnStaleMode, StaleNotification, ReadDependency } from '../coordination/index.js';
|
|
23
17
|
import type { ErrorCode, RequiredCapability } from '../errors.js';
|
|
24
18
|
/**
|
|
25
|
-
* A single operation within a {@link CommitMessage} batch.
|
|
26
|
-
* the
|
|
27
|
-
*
|
|
19
|
+
* A single operation within a {@link CommitMessage} batch. Each operation is
|
|
20
|
+
* the smallest unit the server applies atomically — one create, update,
|
|
21
|
+
* delete, archive, or unarchive against one model row.
|
|
28
22
|
*/
|
|
29
23
|
export interface CommitOperation {
|
|
30
24
|
type: 'CREATE' | 'UPDATE' | 'DELETE' | 'ARCHIVE' | 'UNARCHIVE';
|
|
@@ -32,45 +26,44 @@ export interface CommitOperation {
|
|
|
32
26
|
id?: string | null;
|
|
33
27
|
input?: Record<string, unknown> | null;
|
|
34
28
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
29
|
+
* A client-generated transaction id for this one operation. The server
|
|
30
|
+
* stamps it onto the `sync_deltas.transaction_id` column so the originating
|
|
31
|
+
* client can recognize the resulting broadcast as an echo of its own
|
|
32
|
+
* optimistic write. This is distinct from the batch-level `clientTxId` on
|
|
33
|
+
* {@link CommitMessage}, which the server uses to deduplicate retried batches.
|
|
39
34
|
*/
|
|
40
35
|
transactionId?: string | null;
|
|
41
36
|
/**
|
|
42
|
-
*
|
|
43
|
-
* has
|
|
44
|
-
*
|
|
37
|
+
* A read watermark captured when the client last read this row. The server
|
|
38
|
+
* checks whether the target has changed since this point; if it has, the
|
|
39
|
+
* operation's {@link CommitOperation.onStale} mode decides what happens.
|
|
45
40
|
*/
|
|
46
41
|
readAt?: number | null;
|
|
47
42
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
43
|
+
* What to do when the server detects the row changed since
|
|
44
|
+
* {@link CommitOperation.readAt}. `'reject'` (the default) fails the
|
|
45
|
+
* operation with a stale-context error; `'overwrite'` applies the write
|
|
46
|
+
* regardless; `'notify'` holds the write and returns a
|
|
47
|
+
* {@link StaleNotification} for the caller to resolve.
|
|
52
48
|
*/
|
|
53
49
|
onStale?: OnStaleMode | null;
|
|
54
50
|
/**
|
|
55
|
-
* Write even
|
|
56
|
-
*
|
|
57
|
-
* is
|
|
58
|
-
* claim guard trusts
|
|
59
|
-
*
|
|
60
|
-
* being declared here — the exact contract drift this file exists to
|
|
61
|
-
* prevent.
|
|
51
|
+
* Write even when another participant holds a claim on this row. The default
|
|
52
|
+
* (`false`) rejects the operation with a claimed-entity error while a claim
|
|
53
|
+
* is held. Setting `bypass` overrides that, and the override is recorded. It
|
|
54
|
+
* is honored only for participants the claim guard trusts, such as human and
|
|
55
|
+
* framework identities; a bypass requested by an agent is ignored.
|
|
62
56
|
*/
|
|
63
57
|
bypass?: boolean | null;
|
|
64
58
|
}
|
|
65
59
|
/**
|
|
66
|
-
* Runtime validator for {@link CommitOperation}
|
|
67
|
-
*
|
|
68
|
-
* operation
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* stale-guard SQL (`id > $3`) unvalidated.
|
|
60
|
+
* Runtime validator for {@link CommitOperation}. Both commit transports — the
|
|
61
|
+
* WebSocket `commit` frame and the HTTP `/v1/commits` endpoint — run this check
|
|
62
|
+
* on every operation before it is applied, so a malformed operation is rejected
|
|
63
|
+
* at the edge. It builds on the shared coordination schema, widening `bypass`
|
|
64
|
+
* to also accept `null` so the validator and the interface match exactly. Note
|
|
65
|
+
* that `readAt` must be a number: it feeds the server's stale-check comparison,
|
|
66
|
+
* so a non-numeric watermark is refused here.
|
|
74
67
|
*/
|
|
75
68
|
export declare const commitOperationSchema: z.ZodObject<{
|
|
76
69
|
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
@@ -93,10 +86,10 @@ export declare const commitOperationSchema: z.ZodObject<{
|
|
|
93
86
|
bypass: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
94
87
|
}, z.core.$strip>;
|
|
95
88
|
/**
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
89
|
+
* A client-to-server frame that invokes a single named mutation by name and
|
|
90
|
+
* arguments, as opposed to the raw operation batch in {@link CommitMessage}.
|
|
91
|
+
* The server resolves `mutatorName` against the set of mutations registered on
|
|
92
|
+
* it and runs the matching one.
|
|
100
93
|
*/
|
|
101
94
|
export interface MutationMessage {
|
|
102
95
|
type: 'mutation';
|
|
@@ -107,10 +100,10 @@ export interface MutationMessage {
|
|
|
107
100
|
};
|
|
108
101
|
}
|
|
109
102
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
103
|
+
* A client-to-server frame that asks the server to commit a batch of operations
|
|
104
|
+
* atomically. This is the raw-operation counterpart to {@link MutationMessage};
|
|
105
|
+
* it carries a list of {@link CommitOperation} entries plus the batch metadata
|
|
106
|
+
* below.
|
|
114
107
|
*/
|
|
115
108
|
export interface CommitMessage {
|
|
116
109
|
type: 'commit';
|
|
@@ -118,30 +111,28 @@ export interface CommitMessage {
|
|
|
118
111
|
operations: CommitOperation[];
|
|
119
112
|
clientTxId: string;
|
|
120
113
|
/**
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
* threads it onto `caused_by_task_id`, but client writes leave it
|
|
126
|
-
* `null` (the audit pane treats null as "no prompt-side context").
|
|
114
|
+
* Optional lineage id linking this batch to the task that caused it. When
|
|
115
|
+
* present, the server validates it and records it on the delta's
|
|
116
|
+
* `caused_by_task_id` column for audit trails; when omitted or `null`, the
|
|
117
|
+
* batch simply carries no task attribution.
|
|
127
118
|
*/
|
|
128
119
|
causedByTaskId?: string | null;
|
|
129
120
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
* checked
|
|
121
|
+
* The reads this batch's writes were premised on. Each entry names either a
|
|
122
|
+
* specific row (`{ model, id, readAt, fields? }`) or a sync group
|
|
123
|
+
* (`{ group, readAt }`) that must not have changed since its `readAt`
|
|
124
|
+
* watermark. The server checks every entry and applies its `onStale`
|
|
125
|
+
* disposition to the whole batch if one moved. When omitted, only the rows
|
|
126
|
+
* being written are checked for staleness.
|
|
136
127
|
*/
|
|
137
128
|
reads?: ReadDependency[] | null;
|
|
138
129
|
};
|
|
139
130
|
}
|
|
140
131
|
/**
|
|
141
|
-
* Runtime validator for {@link CommitMessage}
|
|
142
|
-
* server
|
|
143
|
-
* `
|
|
144
|
-
*
|
|
132
|
+
* Runtime validator for the payload of {@link CommitMessage}. It checks every
|
|
133
|
+
* field the server acts on — `operations`, `clientTxId`, `causedByTaskId`, and
|
|
134
|
+
* `reads` — validating each operation with {@link commitOperationSchema} and
|
|
135
|
+
* each read dependency with the shared read-dependency schema.
|
|
145
136
|
*/
|
|
146
137
|
export declare const commitPayloadSchema: z.ZodObject<{
|
|
147
138
|
operations: z.ZodArray<z.ZodObject<{
|
|
@@ -187,13 +178,13 @@ export declare const commitPayloadSchema: z.ZodObject<{
|
|
|
187
178
|
}, z.core.$strip>]>>>>;
|
|
188
179
|
}, z.core.$strip>;
|
|
189
180
|
/**
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* `
|
|
181
|
+
* The server's acknowledgement of a {@link CommitMessage}. Its payload mirrors
|
|
182
|
+
* the commit-receipt shape, so a commit acknowledged over a WebSocket, over the
|
|
183
|
+
* HTTP `/v1/commits` endpoint, or read back from a persisted job result all
|
|
184
|
+
* carry the same fields.
|
|
193
185
|
*
|
|
194
|
-
* `object`, `status`, and `ops` are
|
|
195
|
-
*
|
|
196
|
-
* New clients can rely on them.
|
|
186
|
+
* `object`, `status`, and `ops` are optional in the type but the server always
|
|
187
|
+
* populates them, so a current client can rely on them being present.
|
|
197
188
|
*/
|
|
198
189
|
export interface MutationResultMessage {
|
|
199
190
|
type: 'mutation_result';
|
|
@@ -206,26 +197,264 @@ export interface MutationResultMessage {
|
|
|
206
197
|
lastSyncId?: number;
|
|
207
198
|
ops?: number;
|
|
208
199
|
/**
|
|
209
|
-
*
|
|
210
|
-
* premise
|
|
211
|
-
*
|
|
212
|
-
* `conflict:notified` event and the commit
|
|
200
|
+
* Notifications for operations that used `onStale: 'notify'` and whose
|
|
201
|
+
* premise changed while the batch was being applied. Present only on a
|
|
202
|
+
* successful acknowledgement that resolved such a conflict; the client
|
|
203
|
+
* surfaces each one through its `conflict:notified` event and the commit
|
|
204
|
+
* receipt rather than failing the write.
|
|
213
205
|
*/
|
|
214
206
|
notifications?: StaleNotification[];
|
|
215
207
|
/**
|
|
216
|
-
* Ids of
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
* caller
|
|
208
|
+
* Ids of update or delete targets that matched no rows — because they do
|
|
209
|
+
* not exist or fall outside the caller's organization. Present and
|
|
210
|
+
* non-empty only when a write missed. The client raises a not-found error
|
|
211
|
+
* for the affected caller rather than treating the no-op as a success.
|
|
220
212
|
*/
|
|
221
213
|
missingIds?: string[];
|
|
222
214
|
error?: {
|
|
223
215
|
code: ErrorCode;
|
|
224
216
|
message: string;
|
|
225
217
|
field?: string;
|
|
226
|
-
/**
|
|
227
|
-
*
|
|
218
|
+
/** The capability the commit required but the caller lacked. Present when
|
|
219
|
+
* the commit was denied for want of a capability, so the client can tell
|
|
220
|
+
* the caller exactly what to obtain. */
|
|
228
221
|
requiredCapability?: RequiredCapability;
|
|
229
222
|
};
|
|
230
223
|
};
|
|
231
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* A transport frame carrying the Zod-first v2 commit request. The payload's
|
|
227
|
+
* `schemaVersion` distinguishes it from the legacy `commit` payload during the
|
|
228
|
+
* migration window; the transport does not duplicate the commit contract.
|
|
229
|
+
*/
|
|
230
|
+
export declare const commitRequestMessageSchema: z.ZodObject<{
|
|
231
|
+
type: z.ZodLiteral<"commit">;
|
|
232
|
+
payload: z.ZodObject<{
|
|
233
|
+
idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
|
|
234
|
+
schemaVersion: z.ZodLiteral<2>;
|
|
235
|
+
operations: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
236
|
+
type: z.ZodLiteral<"create">;
|
|
237
|
+
value: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
|
|
238
|
+
operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
|
|
239
|
+
target: z.ZodObject<{
|
|
240
|
+
model: z.ZodString;
|
|
241
|
+
id: z.ZodString;
|
|
242
|
+
}, z.core.$strict>;
|
|
243
|
+
preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
244
|
+
type: z.ZodLiteral<"unchanged_since">;
|
|
245
|
+
cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
|
|
246
|
+
fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
247
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
248
|
+
type: z.ZodLiteral<"version_matches">;
|
|
249
|
+
version: z.ZodNumber;
|
|
250
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
251
|
+
type: z.ZodLiteral<"claim_fence">;
|
|
252
|
+
claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
|
|
253
|
+
generation: z.ZodNumber;
|
|
254
|
+
}, z.core.$strict>], "type">>>;
|
|
255
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
256
|
+
type: z.ZodLiteral<"patch">;
|
|
257
|
+
changes: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
|
|
258
|
+
operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
|
|
259
|
+
target: z.ZodObject<{
|
|
260
|
+
model: z.ZodString;
|
|
261
|
+
id: z.ZodString;
|
|
262
|
+
}, z.core.$strict>;
|
|
263
|
+
preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
264
|
+
type: z.ZodLiteral<"unchanged_since">;
|
|
265
|
+
cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
|
|
266
|
+
fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
267
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
268
|
+
type: z.ZodLiteral<"version_matches">;
|
|
269
|
+
version: z.ZodNumber;
|
|
270
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
271
|
+
type: z.ZodLiteral<"claim_fence">;
|
|
272
|
+
claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
|
|
273
|
+
generation: z.ZodNumber;
|
|
274
|
+
}, z.core.$strict>], "type">>>;
|
|
275
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
276
|
+
type: z.ZodLiteral<"delete">;
|
|
277
|
+
operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
|
|
278
|
+
target: z.ZodObject<{
|
|
279
|
+
model: z.ZodString;
|
|
280
|
+
id: z.ZodString;
|
|
281
|
+
}, z.core.$strict>;
|
|
282
|
+
preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
283
|
+
type: z.ZodLiteral<"unchanged_since">;
|
|
284
|
+
cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
|
|
285
|
+
fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
286
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
287
|
+
type: z.ZodLiteral<"version_matches">;
|
|
288
|
+
version: z.ZodNumber;
|
|
289
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
290
|
+
type: z.ZodLiteral<"claim_fence">;
|
|
291
|
+
claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
|
|
292
|
+
generation: z.ZodNumber;
|
|
293
|
+
}, z.core.$strict>], "type">>>;
|
|
294
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
295
|
+
type: z.ZodLiteral<"archive">;
|
|
296
|
+
operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
|
|
297
|
+
target: z.ZodObject<{
|
|
298
|
+
model: z.ZodString;
|
|
299
|
+
id: z.ZodString;
|
|
300
|
+
}, z.core.$strict>;
|
|
301
|
+
preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
302
|
+
type: z.ZodLiteral<"unchanged_since">;
|
|
303
|
+
cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
|
|
304
|
+
fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
305
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
306
|
+
type: z.ZodLiteral<"version_matches">;
|
|
307
|
+
version: z.ZodNumber;
|
|
308
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
309
|
+
type: z.ZodLiteral<"claim_fence">;
|
|
310
|
+
claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
|
|
311
|
+
generation: z.ZodNumber;
|
|
312
|
+
}, z.core.$strict>], "type">>>;
|
|
313
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
314
|
+
type: z.ZodLiteral<"unarchive">;
|
|
315
|
+
operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
|
|
316
|
+
target: z.ZodObject<{
|
|
317
|
+
model: z.ZodString;
|
|
318
|
+
id: z.ZodString;
|
|
319
|
+
}, z.core.$strict>;
|
|
320
|
+
preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
321
|
+
type: z.ZodLiteral<"unchanged_since">;
|
|
322
|
+
cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
|
|
323
|
+
fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
324
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
325
|
+
type: z.ZodLiteral<"version_matches">;
|
|
326
|
+
version: z.ZodNumber;
|
|
327
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
328
|
+
type: z.ZodLiteral<"claim_fence">;
|
|
329
|
+
claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
|
|
330
|
+
generation: z.ZodNumber;
|
|
331
|
+
}, z.core.$strict>], "type">>>;
|
|
332
|
+
}, z.core.$strict>], "type">>;
|
|
333
|
+
metadata: z.ZodOptional<z.ZodObject<{
|
|
334
|
+
label: z.ZodOptional<z.ZodString>;
|
|
335
|
+
causedByTaskId: z.ZodOptional<z.ZodString>;
|
|
336
|
+
}, z.core.$strict>>;
|
|
337
|
+
}, z.core.$strict>;
|
|
338
|
+
}, z.core.$strict>;
|
|
339
|
+
export type CommitRequestMessage = z.output<typeof commitRequestMessageSchema>;
|
|
340
|
+
/** A transport frame carrying one terminal, status-discriminated v2 receipt. */
|
|
341
|
+
export declare const commitResultMessageSchema: z.ZodObject<{
|
|
342
|
+
type: z.ZodLiteral<"commit_result">;
|
|
343
|
+
payload: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
344
|
+
status: z.ZodLiteral<"committed">;
|
|
345
|
+
syncCursor: z.core.$ZodBranded<z.ZodString, "SyncCursor", "out">;
|
|
346
|
+
operationCount: z.ZodNumber;
|
|
347
|
+
object: z.ZodLiteral<"commit_receipt">;
|
|
348
|
+
schemaVersion: z.ZodLiteral<2>;
|
|
349
|
+
idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
|
|
350
|
+
commitId: z.core.$ZodBranded<z.ZodUUID, "CommitId", "out">;
|
|
351
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
352
|
+
status: z.ZodLiteral<"conflicted">;
|
|
353
|
+
syncCursor: z.core.$ZodBranded<z.ZodString, "SyncCursor", "out">;
|
|
354
|
+
conflicts: z.ZodArray<z.ZodObject<{
|
|
355
|
+
operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
|
|
356
|
+
target: z.ZodObject<{
|
|
357
|
+
model: z.ZodString;
|
|
358
|
+
id: z.ZodString;
|
|
359
|
+
}, z.core.$strict>;
|
|
360
|
+
fields: z.ZodArray<z.ZodString>;
|
|
361
|
+
currentValues: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
|
|
362
|
+
observedAt: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
|
|
363
|
+
}, z.core.$strict>>;
|
|
364
|
+
object: z.ZodLiteral<"commit_receipt">;
|
|
365
|
+
schemaVersion: z.ZodLiteral<2>;
|
|
366
|
+
idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
|
|
367
|
+
commitId: z.core.$ZodBranded<z.ZodUUID, "CommitId", "out">;
|
|
368
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
369
|
+
status: z.ZodLiteral<"rejected">;
|
|
370
|
+
error: z.ZodObject<{
|
|
371
|
+
code: z.ZodUnion<readonly [z.ZodEnum<{}>, z.ZodCustom<`policy:${string}`, `policy:${string}`>]>;
|
|
372
|
+
message: z.ZodString;
|
|
373
|
+
field: z.ZodOptional<z.ZodString>;
|
|
374
|
+
requiredCapability: z.ZodOptional<z.ZodObject<{
|
|
375
|
+
scope: z.ZodString;
|
|
376
|
+
constraints: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
|
|
377
|
+
issuer: z.ZodOptional<z.ZodString>;
|
|
378
|
+
ttlSeconds: z.ZodOptional<z.ZodNumber>;
|
|
379
|
+
nonce: z.ZodOptional<z.ZodString>;
|
|
380
|
+
}, z.core.$strict>>;
|
|
381
|
+
details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
|
|
382
|
+
}, z.core.$strict>;
|
|
383
|
+
object: z.ZodLiteral<"commit_receipt">;
|
|
384
|
+
schemaVersion: z.ZodLiteral<2>;
|
|
385
|
+
idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
|
|
386
|
+
commitId: z.core.$ZodBranded<z.ZodUUID, "CommitId", "out">;
|
|
387
|
+
}, z.core.$strict>], "status">;
|
|
388
|
+
}, z.core.$strict>;
|
|
389
|
+
export type CommitResultMessage = z.output<typeof commitResultMessageSchema>;
|
|
390
|
+
/** Explicit compatibility name for the v1 uppercase operation schema. */
|
|
391
|
+
export declare const legacyCommitOperationSchema: z.ZodObject<{
|
|
392
|
+
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
393
|
+
onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
394
|
+
reject: "reject";
|
|
395
|
+
overwrite: "overwrite";
|
|
396
|
+
notify: "notify";
|
|
397
|
+
}>>>;
|
|
398
|
+
type: z.ZodEnum<{
|
|
399
|
+
CREATE: "CREATE";
|
|
400
|
+
UPDATE: "UPDATE";
|
|
401
|
+
DELETE: "DELETE";
|
|
402
|
+
ARCHIVE: "ARCHIVE";
|
|
403
|
+
UNARCHIVE: "UNARCHIVE";
|
|
404
|
+
}>;
|
|
405
|
+
model: z.ZodString;
|
|
406
|
+
id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
407
|
+
input: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
408
|
+
transactionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
409
|
+
bypass: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
410
|
+
}, z.core.$strip>;
|
|
411
|
+
/** Explicit compatibility name for the v1 `clientTxId` payload schema. */
|
|
412
|
+
export declare const legacyCommitPayloadSchema: z.ZodObject<{
|
|
413
|
+
operations: z.ZodArray<z.ZodObject<{
|
|
414
|
+
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
415
|
+
onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
416
|
+
reject: "reject";
|
|
417
|
+
overwrite: "overwrite";
|
|
418
|
+
notify: "notify";
|
|
419
|
+
}>>>;
|
|
420
|
+
type: z.ZodEnum<{
|
|
421
|
+
CREATE: "CREATE";
|
|
422
|
+
UPDATE: "UPDATE";
|
|
423
|
+
DELETE: "DELETE";
|
|
424
|
+
ARCHIVE: "ARCHIVE";
|
|
425
|
+
UNARCHIVE: "UNARCHIVE";
|
|
426
|
+
}>;
|
|
427
|
+
model: z.ZodString;
|
|
428
|
+
id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
429
|
+
input: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
430
|
+
transactionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
431
|
+
bypass: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
432
|
+
}, z.core.$strip>>;
|
|
433
|
+
clientTxId: z.ZodString;
|
|
434
|
+
causedByTaskId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
435
|
+
reads: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
436
|
+
model: z.ZodString;
|
|
437
|
+
id: z.ZodString;
|
|
438
|
+
readAt: z.ZodNumber;
|
|
439
|
+
fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
440
|
+
onStale: z.ZodOptional<z.ZodEnum<{
|
|
441
|
+
reject: "reject";
|
|
442
|
+
overwrite: "overwrite";
|
|
443
|
+
notify: "notify";
|
|
444
|
+
}>>;
|
|
445
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
446
|
+
group: z.ZodString;
|
|
447
|
+
readAt: z.ZodNumber;
|
|
448
|
+
onStale: z.ZodOptional<z.ZodEnum<{
|
|
449
|
+
reject: "reject";
|
|
450
|
+
overwrite: "overwrite";
|
|
451
|
+
notify: "notify";
|
|
452
|
+
}>>;
|
|
453
|
+
}, z.core.$strip>]>>>>;
|
|
454
|
+
}, z.core.$strip>;
|
|
455
|
+
/** Explicit compatibility alias for the v1 uppercase operation shape. */
|
|
456
|
+
export type LegacyCommitOperation = CommitOperation;
|
|
457
|
+
/** Explicit compatibility alias for the v1 `clientTxId` commit frame. */
|
|
458
|
+
export type LegacyCommitMessage = CommitMessage;
|
|
459
|
+
/** Explicit compatibility alias for the v1 boolean-style mutation receipt. */
|
|
460
|
+
export type LegacyMutationResultMessage = MutationResultMessage;
|
package/dist/wire/frames.js
CHANGED
|
@@ -1,48 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The write-path message shapes for the sync protocol. These cover the frames
|
|
3
|
+
* a client sends to commit work — {@link CommitMessage} (a batch of raw
|
|
4
|
+
* operations) and {@link MutationMessage} (a single named mutation) — and the
|
|
5
|
+
* server's {@link MutationResultMessage} acknowledgement. The same frames flow
|
|
6
|
+
* over a WebSocket connection and over the HTTP commit endpoint.
|
|
3
7
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* any
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* Scope note: the delta/sync frames (`sync_response`, `delta`) are NOT
|
|
12
|
-
* here yet — they reference `SyncDelta`, which currently has two
|
|
13
|
-
* definitions (server `db/deltas` vs package `core`) pending unification.
|
|
14
|
-
* They stay server-local until that lands. Everything in this file
|
|
15
|
-
* depends only on package-canonical types (`OnStaleMode`, `ErrorCode`,
|
|
16
|
-
* `RequiredCapability`), so it is safe to share today.
|
|
17
|
-
*
|
|
18
|
-
* Changing any shape here is a wire-contract change — it requires
|
|
19
|
-
* coordinated client + server updates.
|
|
8
|
+
* Both the client and the server import these definitions from here, so the two
|
|
9
|
+
* sides cannot drift. Each interface is paired with a Zod validator
|
|
10
|
+
* ({@link commitOperationSchema}, {@link commitPayloadSchema}) pinned to it at
|
|
11
|
+
* compile time, so the runtime check and the type stay in lockstep. Changing
|
|
12
|
+
* any shape in this file changes the wire contract and requires the client and
|
|
13
|
+
* server to update together.
|
|
20
14
|
*/
|
|
21
15
|
import { z } from 'zod';
|
|
22
|
-
//
|
|
23
|
-
//
|
|
16
|
+
// The runtime schema primitives are imported straight from the coordination
|
|
17
|
+
// schema module to keep this file's runtime dependencies limited to Zod.
|
|
24
18
|
import { commitOperationSchema as coordinationCommitOperationSchema, readDependencySchema, } from '../coordination/schema.js';
|
|
19
|
+
import { commitReceiptSchema as commitReceiptV2Schema, commitRequestSchema as commitRequestV2Schema, } from '../commit/contract.js';
|
|
25
20
|
/**
|
|
26
|
-
* Runtime validator for {@link CommitOperation}
|
|
27
|
-
*
|
|
28
|
-
* operation
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* stale-guard SQL (`id > $3`) unvalidated.
|
|
21
|
+
* Runtime validator for {@link CommitOperation}. Both commit transports — the
|
|
22
|
+
* WebSocket `commit` frame and the HTTP `/v1/commits` endpoint — run this check
|
|
23
|
+
* on every operation before it is applied, so a malformed operation is rejected
|
|
24
|
+
* at the edge. It builds on the shared coordination schema, widening `bypass`
|
|
25
|
+
* to also accept `null` so the validator and the interface match exactly. Note
|
|
26
|
+
* that `readAt` must be a number: it feeds the server's stale-check comparison,
|
|
27
|
+
* so a non-numeric watermark is refused here.
|
|
34
28
|
*/
|
|
35
29
|
export const commitOperationSchema = coordinationCommitOperationSchema.extend({
|
|
36
30
|
bypass: z.boolean().nullish(),
|
|
37
31
|
});
|
|
38
|
-
//
|
|
32
|
+
// Pins the schema to the interface: this fails to compile if either side drifts.
|
|
39
33
|
const _commitOperationContract = true;
|
|
40
34
|
void _commitOperationContract;
|
|
41
35
|
/**
|
|
42
|
-
* Runtime validator for {@link CommitMessage}
|
|
43
|
-
* server
|
|
44
|
-
* `
|
|
45
|
-
*
|
|
36
|
+
* Runtime validator for the payload of {@link CommitMessage}. It checks every
|
|
37
|
+
* field the server acts on — `operations`, `clientTxId`, `causedByTaskId`, and
|
|
38
|
+
* `reads` — validating each operation with {@link commitOperationSchema} and
|
|
39
|
+
* each read dependency with the shared read-dependency schema.
|
|
46
40
|
*/
|
|
47
41
|
export const commitPayloadSchema = z.object({
|
|
48
42
|
operations: z.array(commitOperationSchema),
|
|
@@ -50,6 +44,26 @@ export const commitPayloadSchema = z.object({
|
|
|
50
44
|
causedByTaskId: z.string().nullish(),
|
|
51
45
|
reads: z.array(readDependencySchema).nullish(),
|
|
52
46
|
});
|
|
53
|
-
//
|
|
47
|
+
// Pins the schema to the payload type: fails to compile if either side drifts.
|
|
54
48
|
const _commitPayloadContract = true;
|
|
55
49
|
void _commitPayloadContract;
|
|
50
|
+
// ── Commit contract v2 ───────────────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* A transport frame carrying the Zod-first v2 commit request. The payload's
|
|
53
|
+
* `schemaVersion` distinguishes it from the legacy `commit` payload during the
|
|
54
|
+
* migration window; the transport does not duplicate the commit contract.
|
|
55
|
+
*/
|
|
56
|
+
export const commitRequestMessageSchema = z.strictObject({
|
|
57
|
+
type: z.literal('commit'),
|
|
58
|
+
payload: commitRequestV2Schema,
|
|
59
|
+
});
|
|
60
|
+
/** A transport frame carrying one terminal, status-discriminated v2 receipt. */
|
|
61
|
+
export const commitResultMessageSchema = z.strictObject({
|
|
62
|
+
type: z.literal('commit_result'),
|
|
63
|
+
payload: commitReceiptV2Schema,
|
|
64
|
+
});
|
|
65
|
+
// ── Explicit v1 compatibility names ─────────────────────────────────────
|
|
66
|
+
/** Explicit compatibility name for the v1 uppercase operation schema. */
|
|
67
|
+
export const legacyCommitOperationSchema = commitOperationSchema;
|
|
68
|
+
/** Explicit compatibility name for the v1 `clientTxId` payload schema. */
|
|
69
|
+
export const legacyCommitPayloadSchema = commitPayloadSchema;
|