@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
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Keeps a per-scope history of reversible changes so a surface can offer undo
|
|
3
|
+
* and redo. Each mutator invocation records an ordered list of inverse
|
|
4
|
+
* operations; `undo()` pops the most recent group and replays those inverses
|
|
5
|
+
* without recording them, then moves the entry onto the redo stack.
|
|
3
6
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* that explicitly below).
|
|
7
|
+
* History is divided into named scopes, one per surface — a deck editor, a
|
|
8
|
+
* spreadsheet, and so on — reached through {@link UndoManager.getScope}. Undo in
|
|
9
|
+
* one surface never affects another.
|
|
8
10
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* - No persistence across sessions (in-memory stack).
|
|
14
|
-
* - No collaborative awareness — undoing after a teammate edited the same
|
|
15
|
-
* row produces a "last writer wins" outcome, not a true merge.
|
|
16
|
-
* - Server-side mutation rejection after optimistic apply does NOT
|
|
17
|
-
* automatically invalidate the undo stack. Consumers should `clear()`
|
|
18
|
-
* the scope on sync error if they want strict correctness.
|
|
11
|
+
* Two things to know about its reach. History lives in memory and does not
|
|
12
|
+
* persist across sessions. And if the server rejects a change after it was
|
|
13
|
+
* applied optimistically, the undo stack is not invalidated automatically; call
|
|
14
|
+
* {@link UndoScope.clear} on a sync error if you need strict correctness.
|
|
19
15
|
*/
|
|
20
16
|
import type { Schema } from '../schema/schema.js';
|
|
21
17
|
import type { SyncStoreContract } from '../react/context.js';
|
|
@@ -24,31 +20,31 @@ import { type UndoConflictPolicy } from './undoApply.js';
|
|
|
24
20
|
export type { InverseOp, UndoEntry };
|
|
25
21
|
export type { UndoConflictPolicy } from './undoApply.js';
|
|
26
22
|
export interface UndoScopeOptions {
|
|
27
|
-
/**
|
|
23
|
+
/** The maximum number of undo entries to keep. Older entries drop off the
|
|
24
|
+
* bottom. Defaults to 100. */
|
|
28
25
|
maxHistory?: number;
|
|
29
26
|
/**
|
|
30
|
-
* How undo
|
|
31
|
-
*
|
|
32
|
-
* stands, never
|
|
33
|
-
* `last-writer-wins` restores the
|
|
27
|
+
* How undo and redo treat a field a collaborator changed after your own
|
|
28
|
+
* change. The default, `skip-stale`, reverts your change only where it still
|
|
29
|
+
* stands, so undo never overwrites a concurrent edit — undo is per user.
|
|
30
|
+
* `last-writer-wins` restores the older behavior of overwriting regardless. See
|
|
34
31
|
* {@link UndoConflictPolicy}.
|
|
35
32
|
*/
|
|
36
33
|
conflictPolicy?: UndoConflictPolicy;
|
|
37
34
|
/**
|
|
38
|
-
*
|
|
39
|
-
* resolved schema key passes
|
|
40
|
-
* lands on
|
|
41
|
-
*
|
|
42
|
-
*
|
|
35
|
+
* A predicate selecting which models this surface owns. The scope records only
|
|
36
|
+
* mutations whose resolved schema key passes it, so, for example, a spreadsheet
|
|
37
|
+
* edit never lands on a deck editor's undo stack. Omit it to track every model,
|
|
38
|
+
* which is fine for a single-surface app but wrong when two surfaces with
|
|
39
|
+
* independent undo share one store.
|
|
43
40
|
*/
|
|
44
41
|
tracksModel?: (schemaKey: string) => boolean;
|
|
45
42
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* `true` only when its manual-record consumers are removed in the same step.
|
|
43
|
+
* When `true`, the scope records undo entries by observing the stream of local
|
|
44
|
+
* mutations, so every write through the store is captured automatically. When
|
|
45
|
+
* `false`, the default, the scope records nothing on its own and relies on
|
|
46
|
+
* explicit {@link UndoScope.record} calls. Use one mode or the other for a given
|
|
47
|
+
* surface, not both, or shared writes are counted twice.
|
|
52
48
|
*/
|
|
53
49
|
recordFromStream?: boolean;
|
|
54
50
|
}
|
|
@@ -61,36 +57,34 @@ export declare class UndoScope<S extends Schema> {
|
|
|
61
57
|
private readonly maxHistory;
|
|
62
58
|
private readonly conflictPolicy;
|
|
63
59
|
/**
|
|
64
|
-
* Observers notified after each successful {@link record}.
|
|
65
|
-
* user actions only
|
|
66
|
-
* without calling `record
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* observer can never wedge the editor's recording path.
|
|
60
|
+
* Observers notified after each successful {@link UndoScope.record}. They see
|
|
61
|
+
* forward user actions only: undo and redo move entries between the stacks
|
|
62
|
+
* without calling `record`, so a listener never observes a reversal. It is a
|
|
63
|
+
* deliberately generic hook — analytics or audit code can watch the stream of
|
|
64
|
+
* committed mutations without the scope knowing about it. A listener that throws
|
|
65
|
+
* is isolated so it cannot break recording.
|
|
71
66
|
*/
|
|
72
67
|
private readonly recordListeners;
|
|
73
68
|
/**
|
|
74
|
-
* Observers notified after
|
|
75
|
-
*
|
|
76
|
-
* reversals too, so React
|
|
77
|
-
* stream-recording path
|
|
78
|
-
* a
|
|
79
|
-
* and a
|
|
69
|
+
* Observers notified after any stack change — record, undo, redo, or clear.
|
|
70
|
+
* Unlike {@link recordListeners}, which fires on forward actions only, this
|
|
71
|
+
* fires on reversals too, so a React consumer can keep `canUndo` and `canRedo`
|
|
72
|
+
* current. Because the stream-recording path adds entries without triggering a
|
|
73
|
+
* render, a component that read `canUndo` on its last render would otherwise go
|
|
74
|
+
* stale and a keyboard handler gated on it would quietly do nothing.
|
|
80
75
|
*/
|
|
81
76
|
private readonly changeListeners;
|
|
82
77
|
/**
|
|
83
|
-
*
|
|
84
|
-
* promise so they run strictly in the order they were
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
* Serializing the whole scope closes both holes with one mechanism.
|
|
78
|
+
* The serialization tail. Recording, undo, and redo all chain off this one
|
|
79
|
+
* promise, so they run strictly in the order they were invoked and never
|
|
80
|
+
* interleave. This matters for correctness, not just throughput, in two ways.
|
|
81
|
+
* Ordering: callers often fire writes without awaiting them, so without
|
|
82
|
+
* serialization an entry would land on the stack when its mutator resolves, and
|
|
83
|
+
* a fast second write could record before a slow first — replaying undo in the
|
|
84
|
+
* wrong order. Snapshot integrity: each recording reads and clears a model's
|
|
85
|
+
* modified-field markers, which form the undo baseline, so two recordings
|
|
86
|
+
* interleaving on the same model would corrupt each other's before-image.
|
|
87
|
+
* Serializing the whole scope closes both gaps at once.
|
|
94
88
|
*/
|
|
95
89
|
private tail;
|
|
96
90
|
/** Predicate selecting which models this surface records (see options). */
|
|
@@ -100,45 +94,45 @@ export declare class UndoScope<S extends Schema> {
|
|
|
100
94
|
/** Unsubscribe from the local-mutation stream. */
|
|
101
95
|
private readonly unsubscribe;
|
|
102
96
|
/**
|
|
103
|
-
* True while
|
|
104
|
-
* commit path
|
|
105
|
-
*
|
|
106
|
-
*
|
|
97
|
+
* True while undo or redo is replaying operations. A replay writes through the
|
|
98
|
+
* normal commit path and therefore re-emits on the local-mutation stream; this
|
|
99
|
+
* flag tells the scope's own listener to ignore those writes so they are not
|
|
100
|
+
* recorded again.
|
|
107
101
|
*/
|
|
108
102
|
private replaying;
|
|
109
|
-
/**
|
|
103
|
+
/** Operations collected during the current tick, flushed together as one entry. */
|
|
110
104
|
private batch;
|
|
111
105
|
private flushScheduled;
|
|
112
106
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
107
|
+
* An open grouping session. While set, stream operations accumulate here across
|
|
108
|
+
* ticks instead of flushing each tick, so a multi-tick action — a drag, or a
|
|
109
|
+
* whole streaming AI response — collapses into a single undo step.
|
|
110
|
+
* {@link UndoScope.endGroup} flushes it.
|
|
117
111
|
*/
|
|
118
112
|
private group;
|
|
119
113
|
/**
|
|
120
|
-
*
|
|
114
|
+
* Suppression of a replay's asynchronous echo, keyed by `${modelKey}:${id}`.
|
|
121
115
|
*
|
|
122
|
-
* The synchronous {@link replaying} flag only
|
|
123
|
-
*
|
|
124
|
-
* synchronously:
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
116
|
+
* The synchronous {@link UndoScope.replaying} flag catches only echoes
|
|
117
|
+
* delivered inline while operations are applied. In practice the engine does not
|
|
118
|
+
* emit a replayed write's echo synchronously: the commit is deferred behind a
|
|
119
|
+
* local-store write, so the echo arrives on the stream after undo or redo has
|
|
120
|
+
* already reset `replaying` and pushed its entry. That late echo would be
|
|
121
|
+
* recorded as a new edit — and recording clears the redo stack, so every undo
|
|
122
|
+
* would quietly destroy its own redo. To prevent that, the row of each operation
|
|
123
|
+
* about to be replayed is marked here synchronously, before the write, and one
|
|
124
|
+
* mark is consumed when the matching mutation arrives, whenever that is. Marks
|
|
125
|
+
* carry a time-to-live so an echo that never arrives — because the write was
|
|
126
|
+
* skipped while offline — cannot linger and wrongly suppress a much later, real
|
|
127
|
+
* edit to the same row.
|
|
134
128
|
*/
|
|
135
129
|
private readonly pendingReplayEchoes;
|
|
136
130
|
constructor(schema: S, store: SyncStoreContract, organizationId: string, options?: UndoScopeOptions);
|
|
137
131
|
/**
|
|
138
|
-
*
|
|
139
|
-
* collapses into
|
|
140
|
-
*
|
|
141
|
-
*
|
|
132
|
+
* Opens a grouping session: every stream-recorded operation until
|
|
133
|
+
* {@link UndoScope.endGroup} collapses into one undo entry. Call it at the start
|
|
134
|
+
* of a gesture, such as a pointer-down, or at the start of an AI response. A
|
|
135
|
+
* second call closes the previous group first.
|
|
142
136
|
*/
|
|
143
137
|
beginGroup(label?: string): void;
|
|
144
138
|
/** Close the grouping session and record the accumulated ops as one entry. */
|
|
@@ -146,25 +140,25 @@ export declare class UndoScope<S extends Schema> {
|
|
|
146
140
|
/** Every `${modelKey}:${id}` a set of ops will touch (all op kinds). */
|
|
147
141
|
private replayEchoKeys;
|
|
148
142
|
/**
|
|
149
|
-
*
|
|
150
|
-
* synchronously, before
|
|
151
|
-
*
|
|
143
|
+
* Arms echo suppression for the rows a replay is about to write. Called
|
|
144
|
+
* synchronously, before the writes, so the marks exist however long the engine
|
|
145
|
+
* takes to surface each echo on the stream. See {@link UndoScope.pendingReplayEchoes}.
|
|
152
146
|
*/
|
|
153
147
|
private markReplayEchoes;
|
|
154
148
|
/**
|
|
155
|
-
* If `${schemaKey}:${modelId}` has an armed
|
|
156
|
-
*
|
|
157
|
-
* marks
|
|
149
|
+
* If `${schemaKey}:${modelId}` has an armed mark, consume one and report that
|
|
150
|
+
* this mutation is the scope's own replay echo, so the caller drops it. Expired
|
|
151
|
+
* marks are pruned along the way, so an echo that never arrives cannot linger.
|
|
158
152
|
*/
|
|
159
153
|
private consumeReplayEcho;
|
|
160
154
|
/** Resolve a stream mutation's registered name to its schema key, or null. */
|
|
161
155
|
private resolveSchemaKey;
|
|
162
156
|
/**
|
|
163
|
-
*
|
|
164
|
-
* and out-of-scope models, derives the forward
|
|
165
|
-
* mutation's `data
|
|
166
|
-
* per-tick flush so a burst of writes
|
|
167
|
-
*
|
|
157
|
+
* The stream listener, and the only place stream-recorded entries originate. It
|
|
158
|
+
* skips replay echoes and out-of-scope models, derives the forward and inverse
|
|
159
|
+
* operations from the mutation's `data` and `previousData`, and defers the stack
|
|
160
|
+
* push to a per-tick flush, so a burst of writes — aligning five layers at once,
|
|
161
|
+
* say — becomes a single undo step.
|
|
168
162
|
*/
|
|
169
163
|
private onLocalMutation;
|
|
170
164
|
private scheduleFlush;
|
|
@@ -178,62 +172,58 @@ export declare class UndoScope<S extends Schema> {
|
|
|
178
172
|
*/
|
|
179
173
|
private enqueue;
|
|
180
174
|
/**
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
175
|
+
* Runs a recording mutator by itself on the scope's serialization chain, so its
|
|
176
|
+
* snapshot, write, and {@link UndoScope.record} happen atomically with respect to
|
|
177
|
+
* undo and redo. This is used by the explicit-record path; the stream-recording
|
|
178
|
+
* path does not need it, since it derives entries from already-committed
|
|
179
|
+
* mutations.
|
|
186
180
|
*/
|
|
187
181
|
runRecorded<T>(work: () => Promise<T>): Promise<T>;
|
|
188
182
|
/**
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
* (untrusted input). Best practice: validate at trust boundaries, type-check
|
|
199
|
-
* internal calls.
|
|
183
|
+
* Records one entry onto the undo stack and clears the redo stack. It is fed
|
|
184
|
+
* both by the per-tick flush and grouping paths from the local-mutation stream
|
|
185
|
+
* and by direct callers using explicit recording. Entries are built internally
|
|
186
|
+
* and therefore trusted, so the schema check here runs only outside production:
|
|
187
|
+
* it catches recorder bugs early, rejecting a malformed operation at ingestion
|
|
188
|
+
* with a clear path rather than letting it fail later during replay, without
|
|
189
|
+
* paying a validation cost on every user action in production. The real
|
|
190
|
+
* validation boundary is {@link parseUndoEntry}, applied to entries loaded from
|
|
191
|
+
* persistence, which is untrusted input.
|
|
200
192
|
*/
|
|
201
193
|
record(entry: UndoEntry): void;
|
|
202
194
|
/**
|
|
203
|
-
*
|
|
204
|
-
* each {@link record} call,
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* `{ kind, modelKey, data }` ops), so a consumer can derive what changed
|
|
209
|
-
* (e.g. "a slideLayers row of type 'chart' was created") without re-querying.
|
|
195
|
+
* Subscribes to every recorded mutation. The listener fires synchronously at the
|
|
196
|
+
* end of each {@link UndoScope.record} call, once the entry is on the undo stack,
|
|
197
|
+
* and the returned function unsubscribes it. The listener receives the full
|
|
198
|
+
* {@link UndoEntry} — its `forwards` carry the `{ kind, modelKey, data }`
|
|
199
|
+
* operations — so a consumer can tell what changed without querying again.
|
|
210
200
|
*/
|
|
211
201
|
onRecord(listener: (entry: UndoEntry) => void): () => void;
|
|
212
202
|
private emitRecord;
|
|
213
203
|
/**
|
|
214
|
-
*
|
|
215
|
-
* `useUndoScope` to re-render so `canUndo
|
|
216
|
-
* consumer
|
|
217
|
-
*
|
|
204
|
+
* Subscribes to any stack change — record, undo, redo, or clear. The React
|
|
205
|
+
* `useUndoScope` hook uses this to re-render so `canUndo` and `canRedo` stay
|
|
206
|
+
* current for every consumer, not only the component that invoked undo or redo.
|
|
207
|
+
* The returned function unsubscribes.
|
|
218
208
|
*/
|
|
219
209
|
onChange(listener: () => void): () => void;
|
|
220
210
|
private emitChange;
|
|
221
211
|
canUndo(): boolean;
|
|
222
212
|
canRedo(): boolean;
|
|
223
213
|
/**
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
* my change only where it still stands.
|
|
214
|
+
* Pops the most recent entry, applies its inverse operations, and pushes it onto
|
|
215
|
+
* the redo stack. Under the default `skip-stale` policy the inverses are first
|
|
216
|
+
* filtered against the current state — paired with the entry's forwards, which
|
|
217
|
+
* record what this change set — so a field a collaborator changed afterward is
|
|
218
|
+
* left untouched, and undo reverts the change only where it still stands.
|
|
230
219
|
*/
|
|
231
220
|
undo(): Promise<void>;
|
|
232
221
|
/**
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* re-asserts
|
|
222
|
+
* Pops the most recently undone entry, re-applies its forward operations, and
|
|
223
|
+
* pushes it onto the undo stack. It mirrors {@link UndoScope.undo}: the forwards
|
|
224
|
+
* are filtered against the current state — paired with the entry's inverses,
|
|
225
|
+
* which record what undo restored — so redo re-asserts the change only where the
|
|
226
|
+
* undone value still stands.
|
|
237
227
|
*/
|
|
238
228
|
redo(): Promise<void>;
|
|
239
229
|
/** Drop all history. Use after bootstrap / sync group change / sync error. */
|
|
@@ -251,14 +241,17 @@ export declare class UndoScope<S extends Schema> {
|
|
|
251
241
|
dispose(): void;
|
|
252
242
|
}
|
|
253
243
|
/**
|
|
254
|
-
*
|
|
255
|
-
* during engine setup
|
|
244
|
+
* The registry of named undo scopes. One instance is created per application
|
|
245
|
+
* during engine setup, and each surface finds its scope by name through
|
|
246
|
+
* {@link UndoManager.getScope}.
|
|
256
247
|
*/
|
|
257
248
|
export declare class UndoManager<S extends Schema> {
|
|
258
249
|
private readonly schema;
|
|
259
250
|
private readonly store;
|
|
260
251
|
private readonly organizationId;
|
|
261
252
|
private readonly scopes;
|
|
253
|
+
/** The options each scope was constructed with, for the mismatch warning below. */
|
|
254
|
+
private readonly creationOptions;
|
|
262
255
|
constructor(schema: S, store: SyncStoreContract, organizationId: string);
|
|
263
256
|
getScope(name: string, options?: UndoScopeOptions): UndoScope<S>;
|
|
264
257
|
clearAll(): void;
|