@abloatai/ablo 0.36.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +71 -2013
- package/NOTICE +2 -2
- package/README.md +25 -71
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -114
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -163
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.js.map +1 -0
- package/dist/source-drizzle.d.ts +2 -0
- package/dist/source-drizzle.d.ts.map +1 -0
- package/dist/source-drizzle.js +2 -0
- package/dist/source-drizzle.js.map +1 -0
- package/dist/source-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +1 -1
- package/docs/api-keys.md +7 -6
- package/docs/api.md +10 -10
- package/docs/client-behavior.md +5 -5
- package/docs/coordination.md +52 -62
- package/docs/data-sources.md +1 -1
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/server-agent.md +2 -2
- package/docs/how-it-works.md +4 -4
- package/docs/identity.md +2 -1
- package/docs/integration-guide.md +24 -13
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +2 -2
- package/docs/migration.md +3 -3
- package/docs/quickstart.md +2 -2
- package/docs/react.md +5 -5
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +8 -8
- package/package.json +63 -166
- package/bin/ablo.cjs +0 -39
- package/dist/BaseSyncedStore.d.ts +0 -843
- package/dist/BaseSyncedStore.js +0 -1971
- package/dist/Database.d.ts +0 -323
- package/dist/Database.js +0 -1502
- package/dist/InstanceCache.d.ts +0 -237
- package/dist/InstanceCache.js +0 -1166
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -454
- package/dist/Model.js +0 -919
- package/dist/ModelRegistry.d.ts +0 -225
- package/dist/ModelRegistry.js +0 -539
- package/dist/NetworkMonitor.d.ts +0 -28
- package/dist/NetworkMonitor.js +0 -79
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -541
- package/dist/SyncClient.js +0 -2202
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -160
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -50
- package/dist/client/createInternalComponents.js +0 -98
- package/dist/client/createModelProxy.d.ts +0 -248
- package/dist/client/createModelProxy.js +0 -884
- package/dist/client/humans.d.ts +0 -69
- package/dist/client/humans.js +0 -78
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -53
- package/dist/client/reactiveEngine.js +0 -688
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/storeCluster.d.ts +0 -47
- package/dist/client/storeCluster.js +0 -118
- package/dist/client/storeLifecycle.d.ts +0 -61
- package/dist/client/storeLifecycle.js +0 -231
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -42
- package/dist/context.js +0 -81
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -230
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/QueryProcessor.d.ts +0 -75
- package/dist/query/QueryProcessor.js +0 -255
- package/dist/query/client.d.ts +0 -64
- package/dist/query/client.js +0 -138
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -242
- package/dist/react/AbloProvider.js +0 -458
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/createAbloReact.d.ts +0 -56
- package/dist/react/createAbloReact.js +0 -51
- package/dist/react/index.d.ts +0 -62
- package/dist/react/index.js +0 -69
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -82
- package/dist/react/useAblo.js +0 -120
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -133
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -42
- package/dist/schema/index.js +0 -80
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -90
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -265
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -83
- package/dist/source/adapter.js +0 -24
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/storeContract.d.ts +0 -145
- package/dist/storeContract.js +0 -12
- package/dist/stores/DatabaseManager.d.ts +0 -107
- package/dist/stores/DatabaseManager.js +0 -388
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/StoreManager.d.ts +0 -114
- package/dist/stores/StoreManager.js +0 -304
- package/dist/stores/SyncActionStore.d.ts +0 -99
- package/dist/stores/SyncActionStore.js +0 -506
- package/dist/stores/openIDBWithTimeout.d.ts +0 -65
- package/dist/stores/openIDBWithTimeout.js +0 -153
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -284
- package/dist/sync/BootstrapFetcher.js +0 -964
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -231
- package/dist/sync/OnDemandLoader.js +0 -743
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -73
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -114
- package/dist/sync/deltaPipeline.js +0 -278
- package/dist/sync/groupChange.d.ts +0 -116
- package/dist/sync/groupChange.js +0 -244
- package/dist/sync/participants.d.ts +0 -132
- package/dist/sync/participants.js +0 -346
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -71
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- package/dist/syncLog/contract.d.ts +0 -20
- package/dist/syncLog/contract.js +0 -19
- package/dist/syncLog/index.d.ts +0 -1
- package/dist/syncLog/index.js +0 -1
- package/dist/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -212
- package/dist/transaction/auth/capability.js +0 -224
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -56
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -124
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -84
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -108
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -45
- package/dist/transaction/coordination/locator.d.ts +0 -104
- package/dist/transaction/coordination/locator.js +0 -102
- package/dist/transaction/coordination/schema.d.ts +0 -1536
- package/dist/transaction/coordination/schema.js +0 -1177
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -107
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -484
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/footprint.d.ts +0 -111
- package/dist/transaction/footprint.js +0 -0
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -285
- package/dist/transaction/plugin.js +0 -106
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -321
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -427
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -101
- package/dist/transaction/resources/where.js +0 -115
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -120
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/fieldRef.d.ts +0 -38
- package/dist/transaction/schema/fieldRef.js +0 -11
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -58
- package/dist/transaction/schema/openapi.js +0 -501
- package/dist/transaction/schema/relation.d.ts +0 -204
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -351
- package/dist/transaction/schema/schema.js +0 -325
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -131
- package/dist/transaction/transport/httpClient.js +0 -146
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1388
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -574
- package/dist/transaction/transport/wsTransport.js +0 -1023
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -550
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -50
- package/dist/transaction/utils/duration.js +0 -77
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -420
- package/dist/transaction/wire/accountResponses.js +0 -290
- package/dist/transaction/wire/auth.d.ts +0 -56
- package/dist/transaction/wire/auth.js +0 -63
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -530
- package/dist/transaction/wire/claims.js +0 -327
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -204
- package/dist/transaction/wire/feedEvent.js +0 -65
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -562
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -54
- package/dist/transaction/wire/index.js +0 -83
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelMutations.d.ts +0 -31
- package/dist/transaction/wire/modelMutations.js +0 -52
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/modelShape.d.ts +0 -78
- package/dist/transaction/wire/modelShape.js +0 -74
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -661
- package/dist/transactions/mutations/MutationQueue.js +0 -2807
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -165
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -63
- package/dist/transactions/mutations/deltaConfirmation.js +0 -235
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -187
- package/dist/transactions/mutations/replayValidation.js +0 -164
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/views/QueryView.d.ts +0 -79
- package/dist/views/QueryView.js +0 -218
- package/dist/views/ViewRegistry.d.ts +0 -20
- package/dist/views/ViewRegistry.js +0 -55
- package/dist/views/incrementalView.d.ts +0 -45
- package/dist/views/incrementalView.js +0 -69
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useContext, useEffect, useRef } from 'react';
|
|
3
|
-
import { AbloInternalContext } from './internalContext.js';
|
|
4
|
-
import { AbloValidationError } from '../transaction/errors.js';
|
|
5
|
-
/**
|
|
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
|
-
*
|
|
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
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* function MutationFailureBoundary() {
|
|
18
|
-
* useMutationFailureListener(({ transaction, error }) => {
|
|
19
|
-
* toast.error(`Couldn't save ${transaction.modelName}: ${error.message}`);
|
|
20
|
-
* });
|
|
21
|
-
* return null;
|
|
22
|
-
* }
|
|
23
|
-
*/
|
|
24
|
-
export function useMutationFailureListener(listener) {
|
|
25
|
-
const ctx = useContext(AbloInternalContext);
|
|
26
|
-
if (!ctx) {
|
|
27
|
-
throw new AbloValidationError('useMutationFailureListener: no <AbloProvider> mounted above this component. ' +
|
|
28
|
-
'Wrap your tree with <AbloProvider ...> from @abloatai/ablo/react.', { code: 'no_ablo_provider' });
|
|
29
|
-
}
|
|
30
|
-
const ref = useRef(listener);
|
|
31
|
-
ref.current = listener;
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
const engine = ctx.engine;
|
|
34
|
-
if (!engine)
|
|
35
|
-
return;
|
|
36
|
-
return engine.onMutationFailure((payload) => { ref.current(payload); });
|
|
37
|
-
}, [ctx, ctx.engine]);
|
|
38
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import type { Schema } from '../transaction/schema/schema.js';
|
|
2
|
-
import type { MutatorDefs } from '../mutators/defineMutators.js';
|
|
3
|
-
import type { UndoScope } from '../mutators/UndoManager.js';
|
|
4
|
-
import type { ResolveSchema } from '../transaction/types/global.js';
|
|
5
|
-
/**
|
|
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.
|
|
9
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*/
|
|
20
|
-
/**
|
|
21
|
-
* Map a `MutatorFn` onto its invoker form — strip `tx`, keep `args`/return.
|
|
22
|
-
*
|
|
23
|
-
* Uses nested `infer O` so the `args`/`result` types are extracted from the
|
|
24
|
-
* function signature without binding the `tx` parameter to a specific
|
|
25
|
-
* `Transaction<S>` variance. Function parameters are contravariant, so a
|
|
26
|
-
* match against `MutatorFn<Schema>` would reject mutators declared against
|
|
27
|
-
* a narrower schema (e.g. `Transaction<typeof appSchema>`). The two-step
|
|
28
|
-
* inference sidesteps that without resorting to `any`/`unknown` placeholders.
|
|
29
|
-
*/
|
|
30
|
-
export type InvokerFor<F> = F extends (options: infer O) => Promise<infer R> ? O extends {
|
|
31
|
-
args: infer A;
|
|
32
|
-
} ? (args: A) => Promise<R> : never : never;
|
|
33
|
-
/**
|
|
34
|
-
* The hook's return shape: same tree as the input `MutatorDefs`, every leaf
|
|
35
|
-
* rewritten to its invoker form.
|
|
36
|
-
*/
|
|
37
|
-
export type MutatorInvokers<M> = {
|
|
38
|
-
[K in keyof M]: {
|
|
39
|
-
[N in keyof M[K]]: InvokerFor<M[K][N]>;
|
|
40
|
-
};
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* Options passed to `useMutators`. When `undoScope` is set, every mutator
|
|
44
|
-
* invocation is wrapped in a `RecordingMutation` and its inverses are
|
|
45
|
-
* pushed to the scope as one undo entry.
|
|
46
|
-
*/
|
|
47
|
-
export interface UseMutatorsOptions<S extends Schema> {
|
|
48
|
-
/** Target undo scope for recording inverses. Omit to disable recording. */
|
|
49
|
-
undoScope?: UndoScope<S>;
|
|
50
|
-
}
|
|
51
|
-
/** Mutator invokers (explicit schema arg). */
|
|
52
|
-
export declare function useMutators<S extends Schema, M extends MutatorDefs<S>>(schema: S, mutators: M, options?: UseMutatorsOptions<S>): MutatorInvokers<M>;
|
|
53
|
-
/** Mutator invokers via the `Register` module augmentation. Schema comes
|
|
54
|
-
* from the `SyncProvider`'s context; the mutator tree is typed against
|
|
55
|
-
* `ResolveSchema` at the call site. */
|
|
56
|
-
export declare function useMutators<M extends ResolveSchema extends Schema ? MutatorDefs<ResolveSchema> : MutatorDefs<Schema>>(mutators: M, options?: UseMutatorsOptions<ResolveSchema extends Schema ? ResolveSchema : Schema>): MutatorInvokers<M>;
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useMemo } from 'react';
|
|
3
|
-
import { createTransaction } from '../mutators/Transaction.js';
|
|
4
|
-
import { createRecordingMutation } from '../mutators/RecordingMutation.js';
|
|
5
|
-
import { useSyncContext } from './context.js';
|
|
6
|
-
import { AbloValidationError } from '../transaction/errors.js';
|
|
7
|
-
import { getContext } from '../context.js';
|
|
8
|
-
export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
|
|
9
|
-
const { store, organizationId, schema: ctxSchema } = useSyncContext();
|
|
10
|
-
// Disambiguate: explicit-schema path has the schema object in first slot;
|
|
11
|
-
// the global-resolved path has the mutator tree there. A schema object
|
|
12
|
-
// has a `.models` property; a mutator tree doesn't.
|
|
13
|
-
const isExplicit = typeof schemaOrMutators === 'object' &&
|
|
14
|
-
schemaOrMutators !== null &&
|
|
15
|
-
'models' in schemaOrMutators;
|
|
16
|
-
const schema = isExplicit ? schemaOrMutators : ctxSchema;
|
|
17
|
-
const mutators = (isExplicit ? mutatorsOrOptions : schemaOrMutators);
|
|
18
|
-
const options = (isExplicit ? maybeOptions : mutatorsOrOptions);
|
|
19
|
-
if (!schema) {
|
|
20
|
-
throw new AbloValidationError('useMutators: no schema available. Pass the schema as the first arg, ' +
|
|
21
|
-
'or build the <AbloProvider> above with `Ablo({ schema })` so the ' +
|
|
22
|
-
'zero-arg overload can read it from context.', { code: 'mutators_schema_missing' });
|
|
23
|
-
}
|
|
24
|
-
const { undoScope } = options ?? {};
|
|
25
|
-
return useMemo(() => {
|
|
26
|
-
const out = {};
|
|
27
|
-
for (const modelKey of Object.keys(mutators)) {
|
|
28
|
-
const group = mutators[modelKey];
|
|
29
|
-
if (!group)
|
|
30
|
-
continue;
|
|
31
|
-
const invokers = {};
|
|
32
|
-
for (const mutatorName of Object.keys(group)) {
|
|
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;
|
|
40
|
-
const label = `${String(modelKey)}.${mutatorName}`;
|
|
41
|
-
invokers[mutatorName] = async (args) => {
|
|
42
|
-
// Recording path: wrap the transaction so each write snapshots its
|
|
43
|
-
// inverse. On success, push the captured entry to the scope.
|
|
44
|
-
//
|
|
45
|
-
// The whole snapshot → write → record sequence runs on the scope's
|
|
46
|
-
// serialization chain so concurrent invocations (a caller may fire
|
|
47
|
-
// writes without awaiting them) record in invocation order and never
|
|
48
|
-
// interleave their shared-model snapshots. See UndoScope.runRecorded.
|
|
49
|
-
if (undoScope) {
|
|
50
|
-
return undoScope.runRecorded(async () => {
|
|
51
|
-
const recording = createRecordingMutation(schema, store, organizationId);
|
|
52
|
-
try {
|
|
53
|
-
const result = await fn({ tx: recording.tx, args });
|
|
54
|
-
const entry = recording.getEntry(label);
|
|
55
|
-
if (entry)
|
|
56
|
-
undoScope.record(entry);
|
|
57
|
-
return result;
|
|
58
|
-
}
|
|
59
|
-
catch (err) {
|
|
60
|
-
// The error is re-thrown to the caller's await (the real
|
|
61
|
-
// consumer surface), so this is a forensic follow-on → debug.
|
|
62
|
-
getContext().logger.debug(`[useMutators] mutator "${label}" threw`, { error: err });
|
|
63
|
-
throw err;
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
// Non-recording path — plain transaction, no inverse capture.
|
|
68
|
-
const tx = createTransaction(schema, store, organizationId);
|
|
69
|
-
try {
|
|
70
|
-
return await fn({ tx, args });
|
|
71
|
-
}
|
|
72
|
-
catch (err) {
|
|
73
|
-
// Re-thrown to the caller's await (the real consumer surface) →
|
|
74
|
-
// this duplicate is forensic, debug only.
|
|
75
|
-
getContext().logger.debug(`[useMutators] mutator "${label}" threw`, { error: err });
|
|
76
|
-
throw err;
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
out[modelKey] = invokers;
|
|
81
|
-
}
|
|
82
|
-
return out;
|
|
83
|
-
}, [schema, mutators, store, organizationId, undoScope]);
|
|
84
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Subscribe a component to a reactive computation and re-render when
|
|
3
|
-
* the result changes. Concurrent-render safe, referentially stable
|
|
4
|
-
* across renders when the value is unchanged.
|
|
5
|
-
*
|
|
6
|
-
* Thin wrapper over React's `useSyncExternalStore` + MobX `reaction`
|
|
7
|
-
* that hides the three-arg ceremony and the "cached snapshot" rule
|
|
8
|
-
* those primitives impose. Consumers write domain code:
|
|
9
|
-
*
|
|
10
|
-
* const count = useReactive(() => store.tasks.length);
|
|
11
|
-
* const todos = useReactive(() => store.tasks.findMany({ status: 'todo' }));
|
|
12
|
-
* const title = useReactive(() => store.user.name ?? 'Guest');
|
|
13
|
-
*
|
|
14
|
-
* and get values that track MobX observables transparently. No
|
|
15
|
-
* subscribe callbacks, no getSnapshot identity contract, no React
|
|
16
|
-
* concurrent-mode mechanics to reason about.
|
|
17
|
-
*
|
|
18
|
-
* ## Equality
|
|
19
|
-
*
|
|
20
|
-
* The default `equals` is structural for arrays (length + element
|
|
21
|
-
* identity) and `Object.is` for everything else — matches what 99%
|
|
22
|
-
* of UI code expects from a reactive read. Pass a custom `equals`
|
|
23
|
-
* for bespoke shapes (deep objects, tuples, etc.).
|
|
24
|
-
*
|
|
25
|
-
* ## Why not raw useSyncExternalStore?
|
|
26
|
-
*
|
|
27
|
-
* `useSyncExternalStore` is React's low-level primitive for library
|
|
28
|
-
* authors. It leaks concurrent-mode internals (tearing protection,
|
|
29
|
-
* commit-phase subscription) into consumer code and enforces a
|
|
30
|
-
* "getSnapshot must return a cached reference" contract that's easy
|
|
31
|
-
* to violate — violating it causes React error #185 (infinite render
|
|
32
|
-
* loop). This helper lives once and enforces the contract so every
|
|
33
|
-
* caller writes the domain-level code, not the primitive.
|
|
34
|
-
*/
|
|
35
|
-
export declare function useReactive<T>(compute: () => T, equals?: (a: T, b: T) => boolean): T;
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useCallback, useRef } from 'react';
|
|
3
|
-
import { useSyncExternalStore } from 'react';
|
|
4
|
-
import { reaction } from 'mobx';
|
|
5
|
-
/**
|
|
6
|
-
* Subscribe a component to a reactive computation and re-render when
|
|
7
|
-
* the result changes. Concurrent-render safe, referentially stable
|
|
8
|
-
* across renders when the value is unchanged.
|
|
9
|
-
*
|
|
10
|
-
* Thin wrapper over React's `useSyncExternalStore` + MobX `reaction`
|
|
11
|
-
* that hides the three-arg ceremony and the "cached snapshot" rule
|
|
12
|
-
* those primitives impose. Consumers write domain code:
|
|
13
|
-
*
|
|
14
|
-
* const count = useReactive(() => store.tasks.length);
|
|
15
|
-
* const todos = useReactive(() => store.tasks.findMany({ status: 'todo' }));
|
|
16
|
-
* const title = useReactive(() => store.user.name ?? 'Guest');
|
|
17
|
-
*
|
|
18
|
-
* and get values that track MobX observables transparently. No
|
|
19
|
-
* subscribe callbacks, no getSnapshot identity contract, no React
|
|
20
|
-
* concurrent-mode mechanics to reason about.
|
|
21
|
-
*
|
|
22
|
-
* ## Equality
|
|
23
|
-
*
|
|
24
|
-
* The default `equals` is structural for arrays (length + element
|
|
25
|
-
* identity) and `Object.is` for everything else — matches what 99%
|
|
26
|
-
* of UI code expects from a reactive read. Pass a custom `equals`
|
|
27
|
-
* for bespoke shapes (deep objects, tuples, etc.).
|
|
28
|
-
*
|
|
29
|
-
* ## Why not raw useSyncExternalStore?
|
|
30
|
-
*
|
|
31
|
-
* `useSyncExternalStore` is React's low-level primitive for library
|
|
32
|
-
* authors. It leaks concurrent-mode internals (tearing protection,
|
|
33
|
-
* commit-phase subscription) into consumer code and enforces a
|
|
34
|
-
* "getSnapshot must return a cached reference" contract that's easy
|
|
35
|
-
* to violate — violating it causes React error #185 (infinite render
|
|
36
|
-
* loop). This helper lives once and enforces the contract so every
|
|
37
|
-
* caller writes the domain-level code, not the primitive.
|
|
38
|
-
*/
|
|
39
|
-
export function useReactive(compute, equals = defaultEquals) {
|
|
40
|
-
// Late-binding refs so the subscribe callback stays stable across
|
|
41
|
-
// re-renders — otherwise React would re-subscribe every render,
|
|
42
|
-
// which both churns the MobX reaction and leaks listeners.
|
|
43
|
-
const computeRef = useRef(compute);
|
|
44
|
-
const equalsRef = useRef(equals);
|
|
45
|
-
equalsRef.current = equals;
|
|
46
|
-
// Cached snapshot — referentially stable between reaction fires.
|
|
47
|
-
const snapshotRef = useRef(null);
|
|
48
|
-
// When `compute` identity changes, its closed-over observable source
|
|
49
|
-
// may have swapped (e.g. useQuery memoized a new QueryView because
|
|
50
|
-
// the where clause changed). The MobX reaction subscribed in
|
|
51
|
-
// `subscribe` only tracks the observables read on its first run; if
|
|
52
|
-
// the source swaps without a re-subscription, the reaction never
|
|
53
|
-
// re-tracks the new observables and `getSnapshot` keeps returning
|
|
54
|
-
// the stale value forever.
|
|
55
|
-
//
|
|
56
|
-
// Detect the swap by reference and:
|
|
57
|
-
// 1. Recompute the snapshot synchronously so the next render returns
|
|
58
|
-
// the fresh value rather than the previous source's last value.
|
|
59
|
-
// Reconcile through `equals` so unchanged values keep their
|
|
60
|
-
// snapshot identity (avoids unnecessary re-renders downstream).
|
|
61
|
-
// 2. Bump `subscribeVersion`, which is the dependency for `subscribe`
|
|
62
|
-
// below — useSyncExternalStore re-subscribes when subscribe's
|
|
63
|
-
// identity changes, the new reaction tracker runs against the
|
|
64
|
-
// latest `computeRef.current`, and dependencies for the new
|
|
65
|
-
// source are correctly captured.
|
|
66
|
-
const subscribeVersionRef = useRef(0);
|
|
67
|
-
if (snapshotRef.current === null) {
|
|
68
|
-
snapshotRef.current = { value: compute() };
|
|
69
|
-
}
|
|
70
|
-
else if (computeRef.current !== compute) {
|
|
71
|
-
// `compute` is a fresh inline arrow at virtually every call site, so this
|
|
72
|
-
// branch runs on essentially every render. Reconcile the snapshot against
|
|
73
|
-
// the latest closure, but only force a re-subscription when the value
|
|
74
|
-
// actually changed. For the dominant case (same observable source, new
|
|
75
|
-
// arrow identity, unchanged value) this avoids tearing down + recreating
|
|
76
|
-
// the MobX reaction — and its double-compute — on every render. A genuine
|
|
77
|
-
// source swap (a memoized compute closing over a new observable source)
|
|
78
|
-
// changes the value, which both updates the snapshot and bumps
|
|
79
|
-
// `subscribeVersion` so the reaction below re-subscribes and re-tracks the
|
|
80
|
-
// new source's observables.
|
|
81
|
-
const next = compute();
|
|
82
|
-
if (!equals(snapshotRef.current.value, next)) {
|
|
83
|
-
snapshotRef.current = { value: next };
|
|
84
|
-
subscribeVersionRef.current++;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// Point the long-lived reaction at the latest closure every render. The
|
|
88
|
-
// reaction expression reads `computeRef.current` at fire time, so it always
|
|
89
|
-
// runs the newest compute (and re-tracks its observables) even when we did
|
|
90
|
-
// not re-subscribe above.
|
|
91
|
-
computeRef.current = compute;
|
|
92
|
-
const subscribeVersion = subscribeVersionRef.current;
|
|
93
|
-
const subscribe = useCallback((onChange) => {
|
|
94
|
-
return reaction(() => computeRef.current(), (next) => {
|
|
95
|
-
const current = snapshotRef.current.value;
|
|
96
|
-
if (!equalsRef.current(current, next)) {
|
|
97
|
-
snapshotRef.current = { value: next };
|
|
98
|
-
onChange();
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
}, [subscribeVersion]);
|
|
102
|
-
const getSnapshot = useCallback(() => snapshotRef.current.value, []);
|
|
103
|
-
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Default equality: structural for arrays, `Object.is` otherwise.
|
|
107
|
-
* Covers the common cases (collection reads, scalar reads) without
|
|
108
|
-
* requiring callers to think about reference identity.
|
|
109
|
-
*/
|
|
110
|
-
function defaultEquals(a, b) {
|
|
111
|
-
if (Object.is(a, b))
|
|
112
|
-
return true;
|
|
113
|
-
if (Array.isArray(a) && Array.isArray(b)) {
|
|
114
|
-
if (a.length !== b.length)
|
|
115
|
-
return false;
|
|
116
|
-
for (let i = 0; i < a.length; i++) {
|
|
117
|
-
if (!Object.is(a[i], b[i]))
|
|
118
|
-
return false;
|
|
119
|
-
}
|
|
120
|
-
return true;
|
|
121
|
-
}
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
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.
|
|
6
|
-
*
|
|
7
|
-
* Variants:
|
|
8
|
-
* - `initial` — the provider just mounted; no connection attempt yet.
|
|
9
|
-
* - `connecting` — bootstrap in progress. `progress` is 0–100 and
|
|
10
|
-
* can drive a determinate progress bar.
|
|
11
|
-
* - `connected` — hydrated and listening. `hasUnsyncedChanges` is
|
|
12
|
-
* true while local writes are waiting for server ack; flip it into
|
|
13
|
-
* "Saving…" UI.
|
|
14
|
-
* - `reconnecting` — WebSocket dropped and the client is retrying.
|
|
15
|
-
* `reason` carries the human-readable close reason when available.
|
|
16
|
-
* - `disconnected` — network failure, server error, or the retry loop
|
|
17
|
-
* gave up. Show the offline / error UI.
|
|
18
|
-
* - `needs-auth` — server rejected the auth token (1008/4001/4003). The
|
|
19
|
-
* consumer's `onSessionExpired` callback has already been invoked
|
|
20
|
-
* by `<AbloProvider>`; this variant exists for UI that wants to
|
|
21
|
-
* reflect the auth state itself.
|
|
22
|
-
*/
|
|
23
|
-
export type SyncStatusSnapshot = {
|
|
24
|
-
readonly name: 'initial';
|
|
25
|
-
} | {
|
|
26
|
-
readonly name: 'connecting';
|
|
27
|
-
readonly progress: number;
|
|
28
|
-
} | {
|
|
29
|
-
readonly name: 'connected';
|
|
30
|
-
readonly hasUnsyncedChanges: boolean;
|
|
31
|
-
} | {
|
|
32
|
-
readonly name: 'reconnecting';
|
|
33
|
-
readonly reason?: string;
|
|
34
|
-
} | {
|
|
35
|
-
readonly name: 'disconnected';
|
|
36
|
-
readonly reason?: string;
|
|
37
|
-
} | {
|
|
38
|
-
readonly name: 'needs-auth';
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Reactive sync-status hook. Bridges MobX `store.syncStatus` +
|
|
42
|
-
* `store.isReady` into React via `useReactive` — concurrent-render
|
|
43
|
-
* safe and immune to the React #185 "getSnapshot should be cached"
|
|
44
|
-
* infinite-loop class of bugs.
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* function StatusPill() {
|
|
48
|
-
* const status = useSyncStatus();
|
|
49
|
-
* switch (status.name) {
|
|
50
|
-
* case 'initial':
|
|
51
|
-
* case 'connecting': return <Pill progress={status.name === 'connecting' ? status.progress : 0}>Loading…</Pill>;
|
|
52
|
-
* case 'connected': return status.hasUnsyncedChanges ? <Pill>Saving…</Pill> : null;
|
|
53
|
-
* case 'reconnecting': return <Pill title={status.reason}>Reconnecting…</Pill>;
|
|
54
|
-
* case 'disconnected': return <Pill title={status.reason}>Offline</Pill>;
|
|
55
|
-
* case 'needs-auth': return null;
|
|
56
|
-
* }
|
|
57
|
-
* }
|
|
58
|
-
*/
|
|
59
|
-
export declare function useSyncStatus(): SyncStatusSnapshot;
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useCallback } from 'react';
|
|
3
|
-
import { useSyncContext } from './context.js';
|
|
4
|
-
import { useReactive } from './useReactive.js';
|
|
5
|
-
/**
|
|
6
|
-
* Reactive sync-status hook. Bridges MobX `store.syncStatus` +
|
|
7
|
-
* `store.isReady` into React via `useReactive` — concurrent-render
|
|
8
|
-
* safe and immune to the React #185 "getSnapshot should be cached"
|
|
9
|
-
* infinite-loop class of bugs.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* function StatusPill() {
|
|
13
|
-
* const status = useSyncStatus();
|
|
14
|
-
* switch (status.name) {
|
|
15
|
-
* case 'initial':
|
|
16
|
-
* case 'connecting': return <Pill progress={status.name === 'connecting' ? status.progress : 0}>Loading…</Pill>;
|
|
17
|
-
* case 'connected': return status.hasUnsyncedChanges ? <Pill>Saving…</Pill> : null;
|
|
18
|
-
* case 'reconnecting': return <Pill title={status.reason}>Reconnecting…</Pill>;
|
|
19
|
-
* case 'disconnected': return <Pill title={status.reason}>Offline</Pill>;
|
|
20
|
-
* case 'needs-auth': return null;
|
|
21
|
-
* }
|
|
22
|
-
* }
|
|
23
|
-
*/
|
|
24
|
-
export function useSyncStatus() {
|
|
25
|
-
const { store } = useSyncContext();
|
|
26
|
-
// `useReactive` tracks the MobX observables read inside deriveStatus
|
|
27
|
-
// (syncStatus.state/progress/pendingChanges/isSessionError/error +
|
|
28
|
-
// the computed isReady), caches the result by shape, and only
|
|
29
|
-
// notifies React when a variant transition actually occurs.
|
|
30
|
-
//
|
|
31
|
-
// Stabilize the closure on `store` identity so useReactive's
|
|
32
|
-
// swap-detection doesn't see a "swap" every render and unnecessarily
|
|
33
|
-
// re-subscribe its MobX reaction.
|
|
34
|
-
const compute = useCallback(() => deriveStatus(store), [store]);
|
|
35
|
-
return useReactive(compute, sameSnapshot);
|
|
36
|
-
}
|
|
37
|
-
/** Map the current store state into the discriminated union. */
|
|
38
|
-
function deriveStatus(store) {
|
|
39
|
-
const { state, progress, pendingChanges, isSessionError, error } = store.syncStatus;
|
|
40
|
-
if (isSessionError) {
|
|
41
|
-
return { name: 'needs-auth' };
|
|
42
|
-
}
|
|
43
|
-
if (state === 'reconnecting') {
|
|
44
|
-
return { name: 'reconnecting', reason: error?.message };
|
|
45
|
-
}
|
|
46
|
-
if (state === 'offline') {
|
|
47
|
-
return { name: 'disconnected', reason: 'offline' };
|
|
48
|
-
}
|
|
49
|
-
if (state === 'error') {
|
|
50
|
-
return { name: 'disconnected', reason: error?.message };
|
|
51
|
-
}
|
|
52
|
-
if (store.isReady) {
|
|
53
|
-
return { name: 'connected', hasUnsyncedChanges: pendingChanges > 0 };
|
|
54
|
-
}
|
|
55
|
-
// state is 'idle' or 'syncing' and not yet ready — bootstrap underway.
|
|
56
|
-
if (state === 'idle' || state === 'syncing') {
|
|
57
|
-
return { name: 'connecting', progress };
|
|
58
|
-
}
|
|
59
|
-
return { name: 'initial' };
|
|
60
|
-
}
|
|
61
|
-
function sameSnapshot(a, b) {
|
|
62
|
-
if (a.name !== b.name)
|
|
63
|
-
return false;
|
|
64
|
-
switch (a.name) {
|
|
65
|
-
case 'initial':
|
|
66
|
-
case 'needs-auth':
|
|
67
|
-
return true;
|
|
68
|
-
case 'connecting':
|
|
69
|
-
return a.progress === b.progress;
|
|
70
|
-
case 'connected':
|
|
71
|
-
return a.hasUnsyncedChanges === b.hasUnsyncedChanges;
|
|
72
|
-
case 'reconnecting':
|
|
73
|
-
case 'disconnected':
|
|
74
|
-
return a.reason === b.reason;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type { Schema } from '../transaction/schema/schema.js';
|
|
2
|
-
import type { UndoScope, UndoScopeOptions } from '../mutators/UndoManager.js';
|
|
3
|
-
import type { ResolveSchema } from '../transaction/types/global.js';
|
|
4
|
-
/**
|
|
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 main
|
|
7
|
-
* editor, a sidebar form — can undo separately without stepping on each other.
|
|
8
|
-
*
|
|
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.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* const { undo, redo, canUndo, canRedo, scope } = useUndoScope('report-editor');
|
|
16
|
-
* const mutate = useMutators(schema, reportMutators, { undoScope: scope });
|
|
17
|
-
*
|
|
18
|
-
* // Cmd+Z handler
|
|
19
|
-
* useHotkey('mod+z', () => { if (canUndo) void undo(); });
|
|
20
|
-
*/
|
|
21
|
-
export interface UseUndoScopeResult<S extends Schema> {
|
|
22
|
-
/** Pass to `useMutators(..., { undoScope })` to enable recording. */
|
|
23
|
-
scope: UndoScope<S>;
|
|
24
|
-
undo: () => Promise<void>;
|
|
25
|
-
redo: () => Promise<void>;
|
|
26
|
-
canUndo: boolean;
|
|
27
|
-
canRedo: boolean;
|
|
28
|
-
/** Drop history. Use after sync errors / auth context changes. */
|
|
29
|
-
clear: () => void;
|
|
30
|
-
}
|
|
31
|
-
/** Per-surface undo/redo (explicit schema arg). */
|
|
32
|
-
export declare function useUndoScope<S extends Schema>(schema: S, name: string, options?: UndoScopeOptions): UseUndoScopeResult<S>;
|
|
33
|
-
/** Per-surface undo/redo via the `Register` module augmentation. */
|
|
34
|
-
export declare function useUndoScope(name: string, options?: UndoScopeOptions): UseUndoScopeResult<ResolveSchema extends Schema ? ResolveSchema : Schema>;
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useEffect, useMemo, useState } from 'react';
|
|
3
|
-
import { UndoManager } from '../mutators/UndoManager.js';
|
|
4
|
-
import { useSyncContext } from './context.js';
|
|
5
|
-
import { AbloValidationError } from '../transaction/errors.js';
|
|
6
|
-
// Module-level weak registry: `SyncStoreContract` → `UndoManager`.
|
|
7
|
-
// A single app wiring through one SyncProvider shares one manager across
|
|
8
|
-
// every useUndoScope call, so scopes with the same name are identity-equal.
|
|
9
|
-
// Storage erases the generic — `UndoManager<S>` is invariant in S, so
|
|
10
|
-
// the WeakMap can't hold the precise type alongside the typed factory
|
|
11
|
-
// signature. We re-assert at retrieval; the contract is "scope keys
|
|
12
|
-
// are unique per-app and the schema is the same across every call
|
|
13
|
-
// for that key."
|
|
14
|
-
const managers = new WeakMap();
|
|
15
|
-
function getManager(key, factory) {
|
|
16
|
-
let m = managers.get(key);
|
|
17
|
-
if (!m) {
|
|
18
|
-
// Generic-erasure boundary at storage. Concentrating the cast
|
|
19
|
-
// here so the retrieval path doesn't have to repeat it.
|
|
20
|
-
const created = factory();
|
|
21
|
-
managers.set(key, created);
|
|
22
|
-
m = created;
|
|
23
|
-
}
|
|
24
|
-
// Single typed cast at retrieval — `as UndoManager<S>` would be
|
|
25
|
-
// rejected (TS sees `UndoManager<Schema>` and `UndoManager<S>` as
|
|
26
|
-
// unrelated), but we're at the runtime/static schema-identity
|
|
27
|
-
// boundary the contract above pins.
|
|
28
|
-
return m;
|
|
29
|
-
}
|
|
30
|
-
export function useUndoScope(schemaOrName, nameOrOptions, maybeOptions) {
|
|
31
|
-
const { store, organizationId, schema: ctxSchema } = useSyncContext();
|
|
32
|
-
const isExplicit = typeof schemaOrName !== 'string';
|
|
33
|
-
const schema = isExplicit ? (schemaOrName) : ctxSchema;
|
|
34
|
-
const name = isExplicit ? nameOrOptions : schemaOrName;
|
|
35
|
-
const options = (isExplicit ? maybeOptions : nameOrOptions);
|
|
36
|
-
if (!schema) {
|
|
37
|
-
throw new AbloValidationError('useUndoScope: no schema available. Pass the schema as the first arg, ' +
|
|
38
|
-
'or build the <AbloProvider> above with `Ablo({ schema })` so the ' +
|
|
39
|
-
'zero-arg overload can read it from context.', { code: 'undo_scope_schema_missing' });
|
|
40
|
-
}
|
|
41
|
-
const scope = useMemo(() => {
|
|
42
|
-
// Store is the identity for the manager — one per SyncProvider.
|
|
43
|
-
const manager = getManager(store, () => new UndoManager(schema, store, organizationId));
|
|
44
|
-
return manager.getScope(name, options);
|
|
45
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
46
|
-
}, [store, organizationId, name]);
|
|
47
|
-
// Local tick forces re-render after undo/redo/clear so canUndo/canRedo
|
|
48
|
-
// reflect the new stack sizes. The scope itself doesn't emit React-
|
|
49
|
-
// friendly notifications; callers that want cross-component reactivity
|
|
50
|
-
// can wire a mobx observable or custom event bus on top.
|
|
51
|
-
const [, setTick] = useState(0);
|
|
52
|
-
// Reset tick when scope identity changes (new store / new orgId).
|
|
53
|
-
useEffect(() => {
|
|
54
|
-
setTick(0);
|
|
55
|
-
}, [scope]);
|
|
56
|
-
// Re-render on any stack change — including entries recorded from the local-
|
|
57
|
-
// mutation stream, which don't otherwise trigger a React update. Without this
|
|
58
|
-
// `canUndo`/`canRedo` go stale in every consumer that didn't itself call
|
|
59
|
-
// undo/redo (e.g. a keyboard handler whose Cmd+Z gate then never fires).
|
|
60
|
-
useEffect(() => {
|
|
61
|
-
return scope.onChange(() => { setTick((t) => t + 1); });
|
|
62
|
-
}, [scope]);
|
|
63
|
-
const size = scope.size();
|
|
64
|
-
return {
|
|
65
|
-
scope,
|
|
66
|
-
undo: async () => {
|
|
67
|
-
await scope.undo();
|
|
68
|
-
setTick((t) => t + 1);
|
|
69
|
-
},
|
|
70
|
-
redo: async () => {
|
|
71
|
-
await scope.redo();
|
|
72
|
-
setTick((t) => t + 1);
|
|
73
|
-
},
|
|
74
|
-
canUndo: size.undo > 0,
|
|
75
|
-
canRedo: size.redo > 0,
|
|
76
|
-
clear: () => {
|
|
77
|
-
scope.clear();
|
|
78
|
-
setTick((t) => t + 1);
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
|
-
}
|