@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,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Returns the
|
|
3
|
-
*
|
|
2
|
+
* Returns the application user id passed to the nearest `<AbloProvider>`, or
|
|
3
|
+
* `null` when your app did not provide one.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Sync identity is resolved on the server from the API key or session, so this
|
|
6
|
+
* value is not required for sync to connect. It is here for your app's own
|
|
7
|
+
* fields — an assignee id, a presence label, a permission check — where the
|
|
8
|
+
* current user matters to your data rather than to the sync layer. Reach for it
|
|
9
|
+
* in leaf components that need the id, for example to fill in a mutation
|
|
10
|
+
* payload.
|
|
8
11
|
*
|
|
9
|
-
* Use this in leaf components that need the current user ID for
|
|
10
|
-
* mutation payloads, presence labels, permission checks, etc.
|
|
11
12
|
* @example
|
|
12
13
|
* function TaskRow({ id }) {
|
|
13
14
|
* const userId = useCurrentUserId();
|
|
@@ -3,15 +3,16 @@ import { useContext } from 'react';
|
|
|
3
3
|
import { AbloInternalContext } from './internalContext.js';
|
|
4
4
|
import { AbloValidationError } from '../errors.js';
|
|
5
5
|
/**
|
|
6
|
-
* Returns the
|
|
7
|
-
*
|
|
6
|
+
* Returns the application user id passed to the nearest `<AbloProvider>`, or
|
|
7
|
+
* `null` when your app did not provide one.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Sync identity is resolved on the server from the API key or session, so this
|
|
10
|
+
* value is not required for sync to connect. It is here for your app's own
|
|
11
|
+
* fields — an assignee id, a presence label, a permission check — where the
|
|
12
|
+
* current user matters to your data rather than to the sync layer. Reach for it
|
|
13
|
+
* in leaf components that need the id, for example to fill in a mutation
|
|
14
|
+
* payload.
|
|
12
15
|
*
|
|
13
|
-
* Use this in leaf components that need the current user ID for
|
|
14
|
-
* mutation payloads, presence labels, permission checks, etc.
|
|
15
16
|
* @example
|
|
16
17
|
* function TaskRow({ id }) {
|
|
17
18
|
* const userId = useCurrentUserId();
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Registers a callback that runs whenever the provider surfaces an error. This
|
|
3
|
+
* covers engine errors such as bootstrap failures and mutation rejections,
|
|
4
|
+
* WebSocket errors, and uncaught exceptions thrown inside `postBootstrap`
|
|
5
|
+
* hooks.
|
|
6
6
|
*
|
|
7
|
-
* Use
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Use it for side effects that should not cause a re-render — telemetry,
|
|
8
|
+
* logging, or a toast. The callback is held in a ref, so a re-render does not
|
|
9
|
+
* resubscribe.
|
|
10
10
|
*
|
|
11
11
|
* @example
|
|
12
12
|
* function ErrorToaster() {
|
|
@@ -3,14 +3,14 @@ import { useContext, useEffect, useRef } from 'react';
|
|
|
3
3
|
import { AbloInternalContext } from './internalContext.js';
|
|
4
4
|
import { AbloValidationError } from '../errors.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Registers a callback that runs whenever the provider surfaces an error. This
|
|
7
|
+
* covers engine errors such as bootstrap failures and mutation rejections,
|
|
8
|
+
* WebSocket errors, and uncaught exceptions thrown inside `postBootstrap`
|
|
9
|
+
* hooks.
|
|
10
10
|
*
|
|
11
|
-
* Use
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Use it for side effects that should not cause a re-render — telemetry,
|
|
12
|
+
* logging, or a toast. The callback is held in a ref, so a re-render does not
|
|
13
|
+
* resubscribe.
|
|
14
14
|
*
|
|
15
15
|
* @example
|
|
16
16
|
* function ErrorToaster() {
|
|
@@ -27,13 +27,12 @@ export function useErrorListener(listener) {
|
|
|
27
27
|
throw new AbloValidationError('useErrorListener: no <AbloProvider> mounted above this component. ' +
|
|
28
28
|
'Wrap your tree with <AbloProvider ...> from @abloatai/ablo/react.', { code: 'no_ablo_provider' });
|
|
29
29
|
}
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// arrows without thrashing the subscription.
|
|
30
|
+
// Hold the latest callback in a ref so the subscription stays stable across
|
|
31
|
+
// renders. Late-binding the listener this way lets callers pass an inline
|
|
32
|
+
// arrow without resubscribing on every render.
|
|
34
33
|
const ref = useRef(listener);
|
|
35
34
|
ref.current = listener;
|
|
36
35
|
useEffect(() => {
|
|
37
|
-
return ctx.subscribeError((err) => ref.current(err));
|
|
36
|
+
return ctx.subscribeError((err) => { ref.current(err); });
|
|
38
37
|
}, [ctx]);
|
|
39
38
|
}
|
|
@@ -5,15 +5,15 @@ export interface MutationFailurePayload {
|
|
|
5
5
|
permanent?: boolean;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* Subscribes a listener to mutation failures. The callback fires whenever the
|
|
9
|
+
* transaction queue rolls back an optimistic write — both permanent rejections
|
|
10
|
+
* (a validation, foreign-key, or authorization error) and rollbacks after the
|
|
11
|
+
* retries are exhausted (for example, the connection drops mid-write).
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* subscription
|
|
13
|
+
* A single listener mounted near the top of your component tree can turn these
|
|
14
|
+
* otherwise-silent rollbacks into toasts or banners. The callback is held in a
|
|
15
|
+
* ref, so re-renders do not tear down and re-create the underlying
|
|
16
|
+
* subscription.
|
|
17
17
|
*
|
|
18
18
|
* @example
|
|
19
19
|
* function MutationFailureBoundary() {
|
|
@@ -3,15 +3,15 @@ import { useContext, useEffect, useRef } from 'react';
|
|
|
3
3
|
import { AbloInternalContext } from './internalContext.js';
|
|
4
4
|
import { AbloValidationError } from '../errors.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Subscribes a listener to mutation failures. The callback fires whenever the
|
|
7
|
+
* transaction queue rolls back an optimistic write — both permanent rejections
|
|
8
|
+
* (a validation, foreign-key, or authorization error) and rollbacks after the
|
|
9
|
+
* retries are exhausted (for example, the connection drops mid-write).
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* subscription
|
|
11
|
+
* A single listener mounted near the top of your component tree can turn these
|
|
12
|
+
* otherwise-silent rollbacks into toasts or banners. The callback is held in a
|
|
13
|
+
* ref, so re-renders do not tear down and re-create the underlying
|
|
14
|
+
* subscription.
|
|
15
15
|
*
|
|
16
16
|
* @example
|
|
17
17
|
* function MutationFailureBoundary() {
|
|
@@ -33,6 +33,6 @@ export function useMutationFailureListener(listener) {
|
|
|
33
33
|
const engine = ctx.engine;
|
|
34
34
|
if (!engine)
|
|
35
35
|
return;
|
|
36
|
-
return engine.onMutationFailure((payload) => ref.current(payload));
|
|
36
|
+
return engine.onMutationFailure((payload) => { ref.current(payload); });
|
|
37
37
|
}, [ctx, ctx.engine]);
|
|
38
38
|
}
|
|
@@ -3,19 +3,19 @@ import type { MutatorDefs } from '../mutators/defineMutators.js';
|
|
|
3
3
|
import type { UndoScope } from '../mutators/UndoManager.js';
|
|
4
4
|
import type { ResolveSchema } from '../types/global.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Turns a mutator tree built with `defineMutators` into callable invokers. The
|
|
7
|
+
* returned object mirrors that tree one-to-one, but each leaf becomes an
|
|
8
|
+
* `(args) => Promise<TResult>` function.
|
|
7
9
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 2. Calls the user's mutator with `{ tx, args }`.
|
|
12
|
-
* 3. Returns the mutator's resolved value.
|
|
10
|
+
* Each invocation builds a fresh `Transaction` bound to the current store and
|
|
11
|
+
* organization, calls your mutator with `{ tx, args }`, and returns whatever
|
|
12
|
+
* the mutator resolves to.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* If a mutator throws, the error propagates to the caller and any writes it
|
|
15
|
+
* already dispatched stay in place — there is no automatic rollback. Wrap the
|
|
16
|
+
* call in your own try/catch and issue compensating writes when you need to
|
|
17
|
+
* undo a partial change, or pass an `undoScope` (see {@link UseMutatorsOptions})
|
|
18
|
+
* to record inverses for undo and redo.
|
|
19
19
|
*/
|
|
20
20
|
/**
|
|
21
21
|
* Map a `MutatorFn` onto its invoker form — strip `tx`, keep `args`/return.
|
|
@@ -30,15 +30,21 @@ export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
|
|
|
30
30
|
continue;
|
|
31
31
|
const invokers = {};
|
|
32
32
|
for (const mutatorName of Object.keys(group)) {
|
|
33
|
-
const
|
|
33
|
+
const maybeFn = group[mutatorName];
|
|
34
|
+
if (!maybeFn)
|
|
35
|
+
continue;
|
|
36
|
+
// Bind the narrowed value: `noUncheckedIndexedAccess` types the indexed
|
|
37
|
+
// read as `Fn | undefined`, and that narrowing doesn't survive into the
|
|
38
|
+
// deferred invoker closures below — a non-optional local does.
|
|
39
|
+
const fn = maybeFn;
|
|
34
40
|
const label = `${String(modelKey)}.${mutatorName}`;
|
|
35
41
|
invokers[mutatorName] = async (args) => {
|
|
36
42
|
// Recording path: wrap the transaction so each write snapshots its
|
|
37
43
|
// inverse. On success, push the captured entry to the scope.
|
|
38
44
|
//
|
|
39
45
|
// The whole snapshot → write → record sequence runs on the scope's
|
|
40
|
-
// serialization chain so concurrent invocations (
|
|
41
|
-
// writes
|
|
46
|
+
// serialization chain so concurrent invocations (a caller may fire
|
|
47
|
+
// writes without awaiting them) record in invocation order and never
|
|
42
48
|
// interleave their shared-model snapshots. See UndoScope.runRecorded.
|
|
43
49
|
if (undoScope) {
|
|
44
50
|
return undoScope.runRecorded(async () => {
|
|
@@ -58,7 +64,7 @@ export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
|
|
|
58
64
|
}
|
|
59
65
|
});
|
|
60
66
|
}
|
|
61
|
-
// Non-recording path — plain transaction,
|
|
67
|
+
// Non-recording path — plain transaction, no inverse capture.
|
|
62
68
|
const tx = createTransaction(schema, store, organizationId);
|
|
63
69
|
try {
|
|
64
70
|
return await fn({ tx, args });
|
|
@@ -48,7 +48,7 @@ export function useReactive(compute, equals = defaultEquals) {
|
|
|
48
48
|
// When `compute` identity changes, its closed-over observable source
|
|
49
49
|
// may have swapped (e.g. useQuery memoized a new QueryView because
|
|
50
50
|
// the where clause changed). The MobX reaction subscribed in
|
|
51
|
-
// `subscribe` only tracks the observables read on its
|
|
51
|
+
// `subscribe` only tracks the observables read on its first run; if
|
|
52
52
|
// the source swaps without a re-subscription, the reaction never
|
|
53
53
|
// re-tracks the new observables and `getSnapshot` keeps returning
|
|
54
54
|
// the stale value forever.
|
|
@@ -71,7 +71,7 @@ export function useReactive(compute, equals = defaultEquals) {
|
|
|
71
71
|
// `compute` is a fresh inline arrow at virtually every call site, so this
|
|
72
72
|
// branch runs on essentially every render. Reconcile the snapshot against
|
|
73
73
|
// the latest closure, but only force a re-subscription when the value
|
|
74
|
-
//
|
|
74
|
+
// actually changed. For the dominant case (same observable source, new
|
|
75
75
|
// arrow identity, unchanged value) this avoids tearing down + recreating
|
|
76
76
|
// the MobX reaction — and its double-compute — on every render. A genuine
|
|
77
77
|
// source swap (a memoized compute closing over a new observable source)
|
|
@@ -98,7 +98,6 @@ export function useReactive(compute, equals = defaultEquals) {
|
|
|
98
98
|
onChange();
|
|
99
99
|
}
|
|
100
100
|
});
|
|
101
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
102
101
|
}, [subscribeVersion]);
|
|
103
102
|
const getSnapshot = useCallback(() => snapshotRef.current.value, []);
|
|
104
103
|
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* states
|
|
4
|
-
* variant carries only the fields that make sense in that
|
|
5
|
-
*
|
|
6
|
-
* Inspired by Liveblocks' `useStatus()` and Zero's `useConnectionState()`:
|
|
7
|
-
* one hook, one switch, no six-boolean guessing games.
|
|
2
|
+
* A snapshot of the current sync status, modeled as a discriminated union so
|
|
3
|
+
* impossible states — such as "connected and offline" at once — cannot be
|
|
4
|
+
* represented. Each variant carries only the fields that make sense in that
|
|
5
|
+
* state, so a single `switch` on `name` narrows to exactly what you can read.
|
|
8
6
|
*
|
|
9
7
|
* Variants:
|
|
10
8
|
* - `initial` — the provider just mounted; no connection attempt yet.
|
|
@@ -2,16 +2,14 @@ import type { Schema } from '../schema/schema.js';
|
|
|
2
2
|
import type { UndoScope, UndoScopeOptions } from '../mutators/UndoManager.js';
|
|
3
3
|
import type { ResolveSchema } from '../types/global.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Provides per-surface undo and redo for mutator invocations. Each named scope
|
|
6
|
+
* owns an independent undo/redo stack, so different parts of your app — a deck
|
|
7
|
+
* editor, a sidebar form — can undo separately without stepping on each other.
|
|
6
8
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* `scope` into `useMutators(schema, mutators, { undoScope: scope })` and the
|
|
12
|
-
* invocations become recorded. `undo()` / `redo()` replay the inverses /
|
|
13
|
-
* forwards as new transactions that do NOT re-record (the manager pushes
|
|
14
|
-
* them between the two stacks explicitly).
|
|
9
|
+
* Wire the returned `scope` into `useMutators(schema, mutators, { undoScope:
|
|
10
|
+
* scope })` and those invocations become recorded. `undo()` and `redo()` replay
|
|
11
|
+
* the captured inverses and forwards as new transactions that do not record
|
|
12
|
+
* themselves; the manager moves the entry between the two stacks explicitly.
|
|
15
13
|
*
|
|
16
14
|
* @example
|
|
17
15
|
* const { undo, redo, canUndo, canRedo, scope } = useUndoScope('deck-editor');
|
|
@@ -30,7 +30,7 @@ function getManager(key, factory) {
|
|
|
30
30
|
export function useUndoScope(schemaOrName, nameOrOptions, maybeOptions) {
|
|
31
31
|
const { store, organizationId, schema: ctxSchema } = useSyncContext();
|
|
32
32
|
const isExplicit = typeof schemaOrName !== 'string';
|
|
33
|
-
const schema = isExplicit ? schemaOrName : ctxSchema;
|
|
33
|
+
const schema = isExplicit ? (schemaOrName) : ctxSchema;
|
|
34
34
|
const name = isExplicit ? nameOrOptions : schemaOrName;
|
|
35
35
|
const options = (isExplicit ? maybeOptions : nameOrOptions);
|
|
36
36
|
if (!schema) {
|
|
@@ -53,12 +53,12 @@ export function useUndoScope(schemaOrName, nameOrOptions, maybeOptions) {
|
|
|
53
53
|
useEffect(() => {
|
|
54
54
|
setTick(0);
|
|
55
55
|
}, [scope]);
|
|
56
|
-
// Re-render on
|
|
56
|
+
// Re-render on any stack change — including entries recorded from the local-
|
|
57
57
|
// mutation stream, which don't otherwise trigger a React update. Without this
|
|
58
58
|
// `canUndo`/`canRedo` go stale in every consumer that didn't itself call
|
|
59
59
|
// undo/redo (e.g. a keyboard handler whose Cmd+Z gate then never fires).
|
|
60
60
|
useEffect(() => {
|
|
61
|
-
return scope.onChange(() => setTick((t) => t + 1));
|
|
61
|
+
return scope.onChange(() => { setTick((t) => t + 1); });
|
|
62
62
|
}, [scope]);
|
|
63
63
|
const size = scope.size();
|
|
64
64
|
return {
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* (`relation.belongsTo()`, `field.string()`) — and the way modern libraries
|
|
7
|
-
* compose config (Better Auth's `plugins: [admin(), twoFactor()]`, shadcn's
|
|
8
|
-
* `cx(a, b)`) — instead of a raw disposition map:
|
|
2
|
+
* Authoring helpers for a model's `conflict` axis — the setting that decides
|
|
3
|
+
* what happens when two writers touch the same row. Instead of writing a raw
|
|
4
|
+
* disposition map, you compose small, named functions the way the rest of the
|
|
5
|
+
* schema DSL reads (`relation.belongsTo()`, `field.string()`):
|
|
9
6
|
*
|
|
10
7
|
* ```ts
|
|
11
8
|
* import { coordination, humansOverwrite, agentsReject } from '@abloatai/ablo/schema';
|
|
@@ -14,12 +11,11 @@
|
|
|
14
11
|
* // → { user: 'overwrite', agent: 'reject' } (a human's write wins, an agent's yields)
|
|
15
12
|
* ```
|
|
16
13
|
*
|
|
17
|
-
* Each helper is named for the
|
|
18
|
-
* `overwrite | reject | notify` vocabulary
|
|
19
|
-
* and returns a partial {@link ConflictAxis}. {@link coordination} merges
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* nicer authoring surface.
|
|
14
|
+
* Each helper is named for the disposition it applies — drawn from the same
|
|
15
|
+
* `overwrite | reject | notify` vocabulary the write guards use (`onStale`) —
|
|
16
|
+
* and returns a partial {@link ConflictAxis}. {@link coordination} merges the
|
|
17
|
+
* pieces, with later rules winning on key collisions. The result is plain,
|
|
18
|
+
* serializable data that the engine reads at commit time.
|
|
23
19
|
*/
|
|
24
20
|
import type { ConflictAxis } from '../policy/types.js';
|
|
25
21
|
/**
|
|
@@ -27,28 +23,28 @@ import type { ConflictAxis } from '../policy/types.js';
|
|
|
27
23
|
* disposition helper below. Compose with {@link coordination}.
|
|
28
24
|
*/
|
|
29
25
|
export type ConflictRule = ConflictAxis;
|
|
30
|
-
/** A human's conflicting write
|
|
26
|
+
/** A human's conflicting write wins and overwrites the other; it is never blocked. Among humans this gives last-write-wins. */
|
|
31
27
|
export declare const humansOverwrite: () => ConflictRule;
|
|
32
|
-
/** A human's conflicting write is
|
|
28
|
+
/** A human's conflicting write is rejected, yielding to a held claim or a stale snapshot. */
|
|
33
29
|
export declare const humansReject: () => ConflictRule;
|
|
34
|
-
/** A human's stale write
|
|
30
|
+
/** A human's stale write triggers a notification: it re-reads and re-applies rather than clobbering. */
|
|
35
31
|
export declare const humansNotify: () => ConflictRule;
|
|
36
|
-
/** An agent's conflicting write
|
|
32
|
+
/** An agent's conflicting write wins and overwrites the other (rarely what you want). */
|
|
37
33
|
export declare const agentsOverwrite: () => ConflictRule;
|
|
38
|
-
/** An agent's conflicting write is
|
|
34
|
+
/** An agent's conflicting write is rejected, yielding to a held claim or a stale snapshot. */
|
|
39
35
|
export declare const agentsReject: () => ConflictRule;
|
|
40
|
-
/** An agent's stale write
|
|
36
|
+
/** An agent's stale write triggers a notification: it re-reads and re-applies rather than clobbering. */
|
|
41
37
|
export declare const agentsNotify: () => ConflictRule;
|
|
42
|
-
/** A system
|
|
38
|
+
/** A system or automation write wins and overwrites the other. */
|
|
43
39
|
export declare const systemOverwrite: () => ConflictRule;
|
|
44
|
-
/** A system
|
|
40
|
+
/** A system or automation write is rejected. */
|
|
45
41
|
export declare const systemReject: () => ConflictRule;
|
|
46
|
-
/** A system
|
|
42
|
+
/** A system or automation stale write triggers a notification: it re-reads and re-applies. */
|
|
47
43
|
export declare const systemNotify: () => ConflictRule;
|
|
48
44
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
45
|
+
* Merges coordination rules into a single {@link ConflictAxis}. Later rules win
|
|
46
|
+
* on key collisions, and a committer kind you leave out falls through to the
|
|
47
|
+
* engine's default at commit time.
|
|
52
48
|
*
|
|
53
49
|
* ```ts
|
|
54
50
|
* coordination(humansOverwrite(), agentsReject()) // → { user: 'overwrite', agent: 'reject' }
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* (`relation.belongsTo()`, `field.string()`) — and the way modern libraries
|
|
7
|
-
* compose config (Better Auth's `plugins: [admin(), twoFactor()]`, shadcn's
|
|
8
|
-
* `cx(a, b)`) — instead of a raw disposition map:
|
|
2
|
+
* Authoring helpers for a model's `conflict` axis — the setting that decides
|
|
3
|
+
* what happens when two writers touch the same row. Instead of writing a raw
|
|
4
|
+
* disposition map, you compose small, named functions the way the rest of the
|
|
5
|
+
* schema DSL reads (`relation.belongsTo()`, `field.string()`):
|
|
9
6
|
*
|
|
10
7
|
* ```ts
|
|
11
8
|
* import { coordination, humansOverwrite, agentsReject } from '@abloatai/ablo/schema';
|
|
@@ -14,38 +11,37 @@
|
|
|
14
11
|
* // → { user: 'overwrite', agent: 'reject' } (a human's write wins, an agent's yields)
|
|
15
12
|
* ```
|
|
16
13
|
*
|
|
17
|
-
* Each helper is named for the
|
|
18
|
-
* `overwrite | reject | notify` vocabulary
|
|
19
|
-
* and returns a partial {@link ConflictAxis}. {@link coordination} merges
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* nicer authoring surface.
|
|
14
|
+
* Each helper is named for the disposition it applies — drawn from the same
|
|
15
|
+
* `overwrite | reject | notify` vocabulary the write guards use (`onStale`) —
|
|
16
|
+
* and returns a partial {@link ConflictAxis}. {@link coordination} merges the
|
|
17
|
+
* pieces, with later rules winning on key collisions. The result is plain,
|
|
18
|
+
* serializable data that the engine reads at commit time.
|
|
23
19
|
*/
|
|
24
20
|
// ── Humans (user sessions) ──────────────────────────────────────────────
|
|
25
|
-
/** A human's conflicting write
|
|
21
|
+
/** A human's conflicting write wins and overwrites the other; it is never blocked. Among humans this gives last-write-wins. */
|
|
26
22
|
export const humansOverwrite = () => ({ user: 'overwrite' });
|
|
27
|
-
/** A human's conflicting write is
|
|
23
|
+
/** A human's conflicting write is rejected, yielding to a held claim or a stale snapshot. */
|
|
28
24
|
export const humansReject = () => ({ user: 'reject' });
|
|
29
|
-
/** A human's stale write
|
|
25
|
+
/** A human's stale write triggers a notification: it re-reads and re-applies rather than clobbering. */
|
|
30
26
|
export const humansNotify = () => ({ user: 'notify' });
|
|
31
27
|
// ── Agents (AI) ─────────────────────────────────────────────────────────
|
|
32
|
-
/** An agent's conflicting write
|
|
28
|
+
/** An agent's conflicting write wins and overwrites the other (rarely what you want). */
|
|
33
29
|
export const agentsOverwrite = () => ({ agent: 'overwrite' });
|
|
34
|
-
/** An agent's conflicting write is
|
|
30
|
+
/** An agent's conflicting write is rejected, yielding to a held claim or a stale snapshot. */
|
|
35
31
|
export const agentsReject = () => ({ agent: 'reject' });
|
|
36
|
-
/** An agent's stale write
|
|
32
|
+
/** An agent's stale write triggers a notification: it re-reads and re-applies rather than clobbering. */
|
|
37
33
|
export const agentsNotify = () => ({ agent: 'notify' });
|
|
38
34
|
// ── System / automation ─────────────────────────────────────────────────
|
|
39
|
-
/** A system
|
|
35
|
+
/** A system or automation write wins and overwrites the other. */
|
|
40
36
|
export const systemOverwrite = () => ({ system: 'overwrite' });
|
|
41
|
-
/** A system
|
|
37
|
+
/** A system or automation write is rejected. */
|
|
42
38
|
export const systemReject = () => ({ system: 'reject' });
|
|
43
|
-
/** A system
|
|
39
|
+
/** A system or automation stale write triggers a notification: it re-reads and re-applies. */
|
|
44
40
|
export const systemNotify = () => ({ system: 'notify' });
|
|
45
41
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
42
|
+
* Merges coordination rules into a single {@link ConflictAxis}. Later rules win
|
|
43
|
+
* on key collisions, and a committer kind you leave out falls through to the
|
|
44
|
+
* engine's default at commit time.
|
|
49
45
|
*
|
|
50
46
|
* ```ts
|
|
51
47
|
* coordination(humansOverwrite(), agentsReject()) // → { user: 'overwrite', agent: 'reject' }
|