@abloatai/ablo 0.34.1 → 0.36.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 -1
- package/CHANGELOG.md +758 -5
- package/README.md +56 -502
- package/bin/ablo.cjs +39 -0
- package/dist/BaseSyncedStore.d.ts +176 -48
- package/dist/BaseSyncedStore.js +346 -214
- package/dist/Database.d.ts +17 -44
- package/dist/Database.js +96 -79
- package/dist/InstanceCache.d.ts +31 -6
- package/dist/InstanceCache.js +65 -30
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +23 -13
- package/dist/Model.js +27 -17
- package/dist/ModelRegistry.d.ts +8 -4
- package/dist/ModelRegistry.js +20 -18
- package/dist/NetworkMonitor.d.ts +3 -1
- package/dist/NetworkMonitor.js +7 -5
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +47 -47
- package/dist/SyncClient.js +215 -156
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +129 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +8 -4
- package/dist/client/createInternalComponents.js +17 -10
- package/dist/client/createModelProxy.d.ts +98 -373
- package/dist/client/createModelProxy.js +233 -139
- package/dist/client/humans.d.ts +69 -0
- package/dist/client/humans.js +78 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +53 -0
- package/dist/client/reactiveEngine.js +688 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/storeCluster.d.ts +47 -0
- package/dist/client/storeCluster.js +118 -0
- package/dist/client/storeLifecycle.d.ts +61 -0
- package/dist/client/storeLifecycle.js +231 -0
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +22 -9
- package/dist/context.js +33 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +230 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +44 -36
- package/dist/index.js +30 -22
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +5 -2
- package/dist/query/client.js +10 -9
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +18 -8
- package/dist/react/AbloProvider.js +10 -9
- package/dist/react/context.d.ts +3 -3
- package/dist/react/context.js +1 -1
- package/dist/react/createAbloReact.d.ts +56 -0
- package/dist/react/createAbloReact.js +51 -0
- package/dist/react/index.d.ts +6 -5
- package/dist/react/index.js +6 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +12 -5
- package/dist/react/useAblo.js +26 -8
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +90 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +11 -10
- package/dist/schema/index.js +22 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +6 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +20 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapter.d.ts +7 -5
- package/dist/source/adapter.js +7 -5
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
- package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
- package/dist/{core → stores}/DatabaseManager.js +14 -13
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/{core → stores}/StoreManager.d.ts +9 -26
- package/dist/{core → stores}/StoreManager.js +29 -77
- package/dist/stores/SyncActionStore.d.ts +4 -2
- package/dist/stores/SyncActionStore.js +11 -17
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +127 -6
- package/dist/sync/BootstrapFetcher.js +511 -83
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +5 -2
- package/dist/sync/OnDemandLoader.js +61 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/bootstrapApply.d.ts +3 -0
- package/dist/sync/bootstrapApply.js +2 -2
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +13 -12
- package/dist/sync/deltaPipeline.js +21 -4
- package/dist/sync/groupChange.d.ts +3 -0
- package/dist/sync/groupChange.js +16 -14
- package/dist/sync/participants.d.ts +24 -6
- package/dist/sync/participants.js +32 -23
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +23 -33
- package/dist/sync/schemas.js +29 -20
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/syncLog/contract.d.ts +20 -0
- package/dist/syncLog/contract.js +19 -0
- package/dist/syncLog/index.d.ts +1 -0
- package/dist/syncLog/index.js +1 -0
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +212 -0
- package/dist/transaction/auth/capability.js +224 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +45 -0
- package/dist/transaction/coordination/locator.d.ts +104 -0
- package/dist/transaction/coordination/locator.js +102 -0
- package/dist/transaction/coordination/schema.d.ts +1536 -0
- package/dist/transaction/coordination/schema.js +1177 -0
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +107 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
- package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/footprint.d.ts +111 -0
- package/dist/transaction/footprint.js +0 -0
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +285 -0
- package/dist/transaction/plugin.js +106 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +321 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +427 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +101 -0
- package/dist/transaction/resources/where.js +115 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +17 -23
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/fieldRef.d.ts +38 -0
- package/dist/transaction/schema/fieldRef.js +11 -0
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +58 -0
- package/dist/transaction/schema/openapi.js +501 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
- package/dist/{schema → transaction/schema}/schema.js +24 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/transaction/transport/httpClient.d.ts +131 -0
- package/dist/{client → transaction/transport}/httpClient.js +6 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +295 -97
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +574 -0
- package/dist/transaction/transport/wsTransport.js +1023 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +73 -45
- package/dist/transaction/utils/duration.d.ts +50 -0
- package/dist/{utils → transaction/utils}/duration.js +32 -0
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +420 -0
- package/dist/transaction/wire/accountResponses.js +290 -0
- package/dist/transaction/wire/auth.d.ts +56 -0
- package/dist/transaction/wire/auth.js +63 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +530 -0
- package/dist/transaction/wire/claims.js +327 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +204 -0
- package/dist/transaction/wire/feedEvent.js +65 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +562 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +54 -0
- package/dist/transaction/wire/index.js +83 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelMutations.d.ts +31 -0
- package/dist/transaction/wire/modelMutations.js +52 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transaction/wire/modelShape.d.ts +78 -0
- package/dist/transaction/wire/modelShape.js +74 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/{core → views}/QueryView.d.ts +2 -2
- package/dist/{core → views}/QueryView.js +2 -2
- package/dist/{core → views}/ViewRegistry.d.ts +1 -1
- package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
- package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +20 -13
- package/docs/api-keys.md +14 -10
- package/docs/api.md +27 -61
- package/docs/audit.md +6 -3
- package/docs/cli.md +41 -13
- package/docs/client-behavior.md +11 -9
- package/docs/concurrency-convention.md +49 -57
- package/docs/coordination.md +283 -121
- package/docs/data-sources.md +7 -5
- package/docs/debugging.md +39 -15
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +46 -45
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +87 -30
- package/docs/guarantees.md +41 -12
- package/docs/how-it-works.md +38 -12
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +77 -74
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +31 -19
- package/docs/mcp.md +46 -21
- package/docs/migration.md +95 -18
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +3 -1
- package/docs/quickstart.md +22 -5
- package/docs/react.md +31 -18
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +4 -2
- package/docs/webhooks.md +12 -10
- package/llms.txt +48 -18
- package/package.json +21 -26
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/cli.cjs +0 -286329
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/client/httpClient.d.ts +0 -80
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/coordination/schema.js +0 -578
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -192
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -71
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/duration.d.ts +0 -25
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- package/docs/interaction-model.md +0 -97
- /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
- /package/dist/{core → query}/QueryProcessor.js +0 -0
- /package/dist/{core/storeContract.js → storeContract.js} +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
- /package/dist/{core → views}/ViewRegistry.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
-
import type { SchemaRecord } from '../schema/schema.js';
|
|
2
|
+
import type { SchemaRecord } from '../transaction/schema/schema.js';
|
|
3
3
|
import { Ablo } from '../client/Ablo.js';
|
|
4
|
-
import type { Claim, Peer } from '../types/streams.js';
|
|
4
|
+
import type { Claim, Duration, Peer } from '../transaction/types/streams.js';
|
|
5
5
|
import type { EngineParticipant, ParticipantScope, ParticipantStatus } from '../sync/participants.js';
|
|
6
6
|
import { type SyncStoreContract } from './context.js';
|
|
7
7
|
/**
|
|
@@ -116,6 +116,18 @@ export type { EngineParticipant, ParticipantScope, ParticipantStatus };
|
|
|
116
116
|
*/
|
|
117
117
|
export interface UseJoinOptions {
|
|
118
118
|
readonly scope?: ParticipantScope;
|
|
119
|
+
/**
|
|
120
|
+
* Lease TTL for the participant claim, as a compact duration (`'5m'`) or a
|
|
121
|
+
* number of seconds. The same dial and the same spelling as
|
|
122
|
+
* `ablo.<model>.join(ids, { ttl })` and every other lease in the SDK.
|
|
123
|
+
*/
|
|
124
|
+
readonly ttl?: Duration;
|
|
125
|
+
/**
|
|
126
|
+
* @deprecated Use `ttl`. Removed in 0.37.0.
|
|
127
|
+
*
|
|
128
|
+
* The same rename as on `ParticipantJoinOptions`: one lease, and the seconds
|
|
129
|
+
* spelling was the one that misled, because it accepted duration strings too.
|
|
130
|
+
*/
|
|
119
131
|
readonly ttlSeconds?: number | string | null;
|
|
120
132
|
/** Tear down + don't re-join while true. */
|
|
121
133
|
readonly paused?: boolean;
|
|
@@ -125,7 +137,7 @@ export interface UseJoinOptions {
|
|
|
125
137
|
* Default `false`: opening a scope subscribes the connection to its deltas
|
|
126
138
|
* (read interest, via `update_subscription`) but does NOT claim it — a
|
|
127
139
|
* viewer is not a claimant. Set `true` when the participant intends to
|
|
128
|
-
* WRITE (editing a
|
|
140
|
+
* WRITE (editing a report, an agent staking work): the claim is sent so peers
|
|
129
141
|
* observe it, and the scope is pinned so it stays subscribed (never warms)
|
|
130
142
|
* for as long as the claim is held.
|
|
131
143
|
*/
|
|
@@ -137,14 +149,12 @@ export interface UseJoinOptions {
|
|
|
137
149
|
* Default `false`: entering a scope subscribes to its FUTURE deltas only — if
|
|
138
150
|
* the scope's rows aren't already loaded, the view is empty until something
|
|
139
151
|
* changes. Set `true` when opening an entity that may not be loaded yet (a
|
|
140
|
-
* deep-linked
|
|
152
|
+
* deep-linked report, a never-opened ledger) so its current rows are fetched and
|
|
141
153
|
* injected once, then kept fresh by the live tail. The fetch is single-flight
|
|
142
154
|
* and runs once per group; a failure soft-fails (the live tail still flows).
|
|
143
155
|
*/
|
|
144
156
|
readonly hydrate?: boolean;
|
|
145
157
|
}
|
|
146
|
-
/** @deprecated Use `ParticipantStatus`. */
|
|
147
|
-
export type MeshParticipantStatus = ParticipantStatus;
|
|
148
158
|
export interface UseJoinReturn {
|
|
149
159
|
readonly participant: EngineParticipant | null;
|
|
150
160
|
/** Everyone else on the engine's sync groups (`participant.presence.others`), bridged to React. */
|
|
@@ -188,7 +198,7 @@ export declare function useJoin(opts: UseJoinOptions): UseJoinReturn;
|
|
|
188
198
|
* subscription on unmount).
|
|
189
199
|
*
|
|
190
200
|
* ```ts
|
|
191
|
-
* const peers = usePeers({
|
|
201
|
+
* const peers = usePeers({ reports: reportId });
|
|
192
202
|
* const alone = !peers.some((p) => p.participantKind === 'user');
|
|
193
203
|
* ```
|
|
194
204
|
*/
|
|
@@ -200,7 +210,7 @@ export declare function usePeers(scope?: ParticipantScope): readonly Peer[];
|
|
|
200
210
|
*
|
|
201
211
|
* The generic parameter narrows the return type to your schema's
|
|
202
212
|
* model record so call sites get typed `sync.tasks.findMany()` /
|
|
203
|
-
* `sync.
|
|
213
|
+
* `sync.sections.create(...)` without a cast at the call site:
|
|
204
214
|
*
|
|
205
215
|
* ```ts
|
|
206
216
|
* const sync = useSync<(typeof schema)['models']>();
|
|
@@ -5,7 +5,7 @@ import { Ablo } from '../client/Ablo.js';
|
|
|
5
5
|
import { createParticipantClaimId, parseParticipantTtlSeconds, resolveParticipantSyncGroups, } from '../sync/participants.js';
|
|
6
6
|
import { SyncContext } from './context.js';
|
|
7
7
|
import { AbloInternalContext } from './internalContext.js';
|
|
8
|
-
import { AbloValidationError } from '../errors.js';
|
|
8
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
9
9
|
import { useSyncStatus } from './useSyncStatus.js';
|
|
10
10
|
import { DefaultFallback } from './DefaultFallback.js';
|
|
11
11
|
// ── Implementation ───────────────────────────────────────────────────
|
|
@@ -224,8 +224,8 @@ export function useJoin(opts) {
|
|
|
224
224
|
const ctx = useContext(AbloInternalContext);
|
|
225
225
|
const engine = ctx?.engine ?? null;
|
|
226
226
|
const { paused = false } = opts;
|
|
227
|
-
// Resolve the model-form scope ({
|
|
228
|
-
// model's declared `scope` kind is honored (typename `
|
|
227
|
+
// Resolve the model-form scope ({ reports: id } / refs) THROUGH the schema, so a
|
|
228
|
+
// model's declared `scope` kind is honored (typename `Report` → `report:<id>`,
|
|
229
229
|
// not the `type:id` string fallback). Schema appears once the engine is ready;
|
|
230
230
|
// until then refs resolve by convention, then re-resolve when it arrives.
|
|
231
231
|
const scopeKey = JSON.stringify(resolveParticipantSyncGroups(opts.scope, engine?.schema).sort());
|
|
@@ -298,13 +298,13 @@ export function useJoin(opts) {
|
|
|
298
298
|
if (syncStatus.name !== 'connected')
|
|
299
299
|
return;
|
|
300
300
|
const ws = engine._ws;
|
|
301
|
-
if (!ws)
|
|
302
|
-
return;
|
|
303
301
|
const store = engine._store;
|
|
304
302
|
let cancelled = false;
|
|
305
303
|
const claimId = createParticipantClaimId();
|
|
306
304
|
ws.sendClaim(claimId, scopedSyncGroups, {
|
|
307
|
-
|
|
305
|
+
// Reading the retired spelling IS the compatibility path; it goes at 0.37.0.
|
|
306
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
307
|
+
ttlSeconds: parseParticipantTtlSeconds(opts.ttl ?? opts.ttlSeconds),
|
|
308
308
|
})
|
|
309
309
|
.then(() => {
|
|
310
310
|
if (!cancelled)
|
|
@@ -322,7 +322,8 @@ export function useJoin(opts) {
|
|
|
322
322
|
ws.sendRelease(claimId);
|
|
323
323
|
void store.unpinScope?.(scope);
|
|
324
324
|
};
|
|
325
|
-
|
|
325
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated -- same compatibility read as above.
|
|
326
|
+
}, [engine, paused, scopeKey, syncStatus.name, opts.ttl, opts.ttlSeconds, opts.claim]);
|
|
326
327
|
// Bridge the engine's presence + claims streams into React state.
|
|
327
328
|
// Plain useState + useEffect is sufficient — mid-frame tearing on a
|
|
328
329
|
// peer list is harmless (users won't notice one frame of stale
|
|
@@ -370,7 +371,7 @@ export function useJoin(opts) {
|
|
|
370
371
|
* subscription on unmount).
|
|
371
372
|
*
|
|
372
373
|
* ```ts
|
|
373
|
-
* const peers = usePeers({
|
|
374
|
+
* const peers = usePeers({ reports: reportId });
|
|
374
375
|
* const alone = !peers.some((p) => p.participantKind === 'user');
|
|
375
376
|
* ```
|
|
376
377
|
*/
|
|
@@ -408,7 +409,7 @@ export function usePeers(scope) {
|
|
|
408
409
|
*
|
|
409
410
|
* The generic parameter narrows the return type to your schema's
|
|
410
411
|
* model record so call sites get typed `sync.tasks.findMany()` /
|
|
411
|
-
* `sync.
|
|
412
|
+
* `sync.sections.create(...)` without a cast at the call site:
|
|
412
413
|
*
|
|
413
414
|
* ```ts
|
|
414
415
|
* const sync = useSync<(typeof schema)['models']>();
|
package/dist/react/context.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
-
import type { Schema } from '../schema/schema.js';
|
|
3
|
-
import type { SyncStoreContract } from '../
|
|
4
|
-
export type { SyncStoreContract, LocalMutation } from '../
|
|
2
|
+
import type { Schema } from '../transaction/schema/schema.js';
|
|
3
|
+
import type { SyncStoreContract } from '../storeContract.js';
|
|
4
|
+
export type { SyncStoreContract, LocalMutation } from '../storeContract.js';
|
|
5
5
|
export interface SyncReactContext {
|
|
6
6
|
store: SyncStoreContract;
|
|
7
7
|
/** The organization id used as the default scope for reads and writes. */
|
package/dist/react/context.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { createContext, createElement, useContext } from 'react';
|
|
3
|
-
import { AbloValidationError } from '../errors.js';
|
|
3
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
4
4
|
export const SyncContext = createContext(null);
|
|
5
5
|
/**
|
|
6
6
|
* Reads the sync store context from inside a provider subtree, throwing a clear
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The typed react binding — the schema generic is captured ONCE, at a factory
|
|
3
|
+
* call in app code, and every hook the factory returns is born typed. This is
|
|
4
|
+
* the shape the reference libraries converged on independently (tRPC's
|
|
5
|
+
* `createTRPCReact`, XState's `createActorContext`, react-redux's
|
|
6
|
+
* `withTypes`): no module augmentation, no generic parameters at call sites,
|
|
7
|
+
* and — once the legacy generic erasure retires — no casts anywhere on the
|
|
8
|
+
* path from context to component.
|
|
9
|
+
*
|
|
10
|
+
* The app's one binding file, by convention:
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* // lib/ablo.ts
|
|
14
|
+
* import { createAbloReact } from '@abloatai/ablo/react';
|
|
15
|
+
* import { schema } from './schema';
|
|
16
|
+
*
|
|
17
|
+
* export const { AbloProvider, useAblo } = createAbloReact(schema);
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* Components then import `useAblo` from `lib/ablo` and never spell a type
|
|
21
|
+
* argument; `useAblo()` is `Ablo<S> | null`, and a selector's `ablo`
|
|
22
|
+
* parameter is the reactive-read view of the same `S`.
|
|
23
|
+
*/
|
|
24
|
+
import { type ReactElement } from 'react';
|
|
25
|
+
import { type AbloProviderProps } from './AbloProvider.js';
|
|
26
|
+
import { type AbloSelector, type ModelClientSelector, type UseAbloHydratedModelResult, type UseAbloModelOptions, type UseAbloModelResult } from './useAblo.js';
|
|
27
|
+
import type { Ablo } from '../client/Ablo.js';
|
|
28
|
+
import type { ModelOperations } from '../client/createModelProxy.js';
|
|
29
|
+
import type { Schema, SchemaRecord } from '../transaction/schema/schema.js';
|
|
30
|
+
/** What a binding returns: the provider and the hook, with `S` fixed. */
|
|
31
|
+
export interface AbloReactBinding<S extends SchemaRecord> {
|
|
32
|
+
/** `AbloProvider` with its `client` prop typed `Ablo<S>` — same component,
|
|
33
|
+
* no per-app generics. */
|
|
34
|
+
AbloProvider: (props: AbloProviderProps<S>) => ReactElement;
|
|
35
|
+
/** `useAblo` with the schema bound — the same overloads as the global
|
|
36
|
+
* hook, minus the type arguments. */
|
|
37
|
+
useAblo: {
|
|
38
|
+
(): Ablo<S> | null;
|
|
39
|
+
<T>(select: AbloSelector<S, T>): T | undefined;
|
|
40
|
+
<T, C>(modelClient: ModelOperations<T, C>, id: string, options: UseAbloModelOptions<T> & {
|
|
41
|
+
readonly initial: T;
|
|
42
|
+
}): UseAbloHydratedModelResult<T>;
|
|
43
|
+
<T, C>(select: ModelClientSelector<S, T, C>, id: string, options: UseAbloModelOptions<T> & {
|
|
44
|
+
readonly initial: T;
|
|
45
|
+
}): UseAbloHydratedModelResult<T>;
|
|
46
|
+
<T, C>(modelClient: ModelOperations<T, C>, id: string, options?: UseAbloModelOptions<T>): UseAbloModelResult<T>;
|
|
47
|
+
<T, C>(select: ModelClientSelector<S, T, C>, id: string, options?: UseAbloModelOptions<T>): UseAbloModelResult<T>;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Bind the react surface to one schema. The schema value is taken for
|
|
52
|
+
* inference — write `createAbloReact(schema)`, never a hand-spelled type
|
|
53
|
+
* argument — and it is the seam where the binding's own typed context arrives
|
|
54
|
+
* when the legacy erasure retires (docs/plans/typed-react-binding.md, step 3).
|
|
55
|
+
*/
|
|
56
|
+
export declare function createAbloReact<S extends SchemaRecord>(schema: Schema<S>): AbloReactBinding<S>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* The typed react binding — the schema generic is captured ONCE, at a factory
|
|
4
|
+
* call in app code, and every hook the factory returns is born typed. This is
|
|
5
|
+
* the shape the reference libraries converged on independently (tRPC's
|
|
6
|
+
* `createTRPCReact`, XState's `createActorContext`, react-redux's
|
|
7
|
+
* `withTypes`): no module augmentation, no generic parameters at call sites,
|
|
8
|
+
* and — once the legacy generic erasure retires — no casts anywhere on the
|
|
9
|
+
* path from context to component.
|
|
10
|
+
*
|
|
11
|
+
* The app's one binding file, by convention:
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* // lib/ablo.ts
|
|
15
|
+
* import { createAbloReact } from '@abloatai/ablo/react';
|
|
16
|
+
* import { schema } from './schema';
|
|
17
|
+
*
|
|
18
|
+
* export const { AbloProvider, useAblo } = createAbloReact(schema);
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Components then import `useAblo` from `lib/ablo` and never spell a type
|
|
22
|
+
* argument; `useAblo()` is `Ablo<S> | null`, and a selector's `ablo`
|
|
23
|
+
* parameter is the reactive-read view of the same `S`.
|
|
24
|
+
*/
|
|
25
|
+
import { createContext, createElement, useContext } from 'react';
|
|
26
|
+
import { AbloProvider } from './AbloProvider.js';
|
|
27
|
+
import { useAbloImpl, } from './useAblo.js';
|
|
28
|
+
/**
|
|
29
|
+
* Bind the react surface to one schema. The schema value is taken for
|
|
30
|
+
* inference — write `createAbloReact(schema)`, never a hand-spelled type
|
|
31
|
+
* argument — and it is the seam where the binding's own typed context arrives
|
|
32
|
+
* when the legacy erasure retires (docs/plans/typed-react-binding.md, step 3).
|
|
33
|
+
*/
|
|
34
|
+
export function createAbloReact(schema) {
|
|
35
|
+
void schema;
|
|
36
|
+
// The binding's own context — created here, AFTER the schema generic is
|
|
37
|
+
// known, so it is typed `Ablo<S>` from birth (the XState
|
|
38
|
+
// `createActorContext` shape). A hook that reads it never rebinds and
|
|
39
|
+
// never casts; a binding hook mounted under a legacy provider (no bound
|
|
40
|
+
// provider in the tree) reads `null` here and falls through to the shared
|
|
41
|
+
// implementation's internal-context fallback.
|
|
42
|
+
const BoundClientContext = createContext(null);
|
|
43
|
+
function BoundAbloProvider(props) {
|
|
44
|
+
return createElement(BoundClientContext.Provider, { value: props.client }, createElement((AbloProvider), props));
|
|
45
|
+
}
|
|
46
|
+
function useBoundAblo(modelOrSelect, id, options) {
|
|
47
|
+
const bound = useContext(BoundClientContext);
|
|
48
|
+
return useAbloImpl(bound, modelOrSelect, id, options);
|
|
49
|
+
}
|
|
50
|
+
return { AbloProvider: BoundAbloProvider, useAblo: useBoundAblo };
|
|
51
|
+
}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
*
|
|
22
22
|
* # Data hooks
|
|
23
23
|
*
|
|
24
|
-
* useAblo((ablo) => ablo.tasks.
|
|
24
|
+
* useAblo((ablo) => ablo.tasks.local.retrieve(id)) — subscribe to a local snapshot (the main read API)
|
|
25
25
|
* useAblo() — the typed client, for callbacks and effects:
|
|
26
|
-
* synchronous local reads (`ablo.<model>.
|
|
26
|
+
* synchronous local reads (`ablo.<model>.local.retrieve`/`local.list`),
|
|
27
27
|
* async server reads (`retrieve`/`list`),
|
|
28
28
|
* and writes (`create`/`update`/`delete`)
|
|
29
29
|
* useMutators(defs, opts?) — define custom mutators
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
* useAblo((ablo) => ablo.<model>.claim.state(...)) — reactive coordination reads
|
|
44
44
|
* useJoin({ scope }) — join a scope to get its peers and claims
|
|
45
45
|
*/
|
|
46
|
-
export type { DefaultSyncShape, ResolveSchema, ResolveUserMeta, ResolveModelKey, } from '../types/global.js';
|
|
47
|
-
export { AbloProvider, useJoin, usePeers, useSync, useSyncStore, type AbloProviderProps, type ParticipantScope, type ParticipantStatus, type UseJoinOptions, type UseJoinReturn,
|
|
46
|
+
export type { DefaultSyncShape, ResolveSchema, ResolveUserMeta, ResolveClaimMeta, ResolveModelKey, } from '../transaction/types/global.js';
|
|
47
|
+
export { AbloProvider, useJoin, usePeers, useSync, useSyncStore, type AbloProviderProps, type ParticipantScope, type ParticipantStatus, type UseJoinOptions, type UseJoinReturn, } from './AbloProvider.js';
|
|
48
48
|
export { ClientSideSuspense, type ClientSideSuspenseProps, } from './ClientSideSuspense.js';
|
|
49
49
|
export { DefaultFallback } from './DefaultFallback.js';
|
|
50
50
|
export type { SyncStoreContract } from './context.js';
|
|
@@ -52,10 +52,11 @@ export { useSyncStatus, type SyncStatusSnapshot, } from './useSyncStatus.js';
|
|
|
52
52
|
export { useErrorListener } from './useErrorListener.js';
|
|
53
53
|
export { useMutationFailureListener, type MutationFailurePayload, } from './useMutationFailureListener.js';
|
|
54
54
|
export { useCurrentUserId } from './useCurrentUserId.js';
|
|
55
|
+
export { createAbloReact, type AbloReactBinding } from './createAbloReact.js';
|
|
55
56
|
export { useReactive } from './useReactive.js';
|
|
56
57
|
export type { MutateActions } from '../mutators/mutateActions.js';
|
|
57
58
|
export type { ReaderActions, ReaderFindOptions } from '../mutators/readerActions.js';
|
|
58
59
|
export { useMutators, type MutatorInvokers, type InvokerFor, type UseMutatorsOptions, } from './useMutators.js';
|
|
59
60
|
export { useUndoScope, type UseUndoScopeResult } from './useUndoScope.js';
|
|
60
61
|
export { useAblo, type UseAbloHydratedModelResult, type UseAbloModelOptions, type UseAbloModelResult, } from './useAblo.js';
|
|
61
|
-
export { ModelScope } from '../types/index.js';
|
|
62
|
+
export { ModelScope } from '../transaction/types/index.js';
|
package/dist/react/index.js
CHANGED
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
*
|
|
22
22
|
* # Data hooks
|
|
23
23
|
*
|
|
24
|
-
* useAblo((ablo) => ablo.tasks.
|
|
24
|
+
* useAblo((ablo) => ablo.tasks.local.retrieve(id)) — subscribe to a local snapshot (the main read API)
|
|
25
25
|
* useAblo() — the typed client, for callbacks and effects:
|
|
26
|
-
* synchronous local reads (`ablo.<model>.
|
|
26
|
+
* synchronous local reads (`ablo.<model>.local.retrieve`/`local.list`),
|
|
27
27
|
* async server reads (`retrieve`/`list`),
|
|
28
28
|
* and writes (`create`/`update`/`delete`)
|
|
29
29
|
* useMutators(defs, opts?) — define custom mutators
|
|
@@ -52,6 +52,9 @@ export { useSyncStatus, } from './useSyncStatus.js';
|
|
|
52
52
|
export { useErrorListener } from './useErrorListener.js';
|
|
53
53
|
export { useMutationFailureListener, } from './useMutationFailureListener.js';
|
|
54
54
|
export { useCurrentUserId } from './useCurrentUserId.js';
|
|
55
|
+
// The typed binding — capture the schema generic once, in the app's one
|
|
56
|
+
// binding file, and import born-typed hooks everywhere (the tRPC shape).
|
|
57
|
+
export { createAbloReact } from './createAbloReact.js';
|
|
55
58
|
// ── Primitive for building custom reactive hooks ──────────────────
|
|
56
59
|
//
|
|
57
60
|
// Consumers building bespoke hooks on top of the SDK should call
|
|
@@ -63,4 +66,4 @@ export { useMutators, } from './useMutators.js';
|
|
|
63
66
|
export { useUndoScope } from './useUndoScope.js';
|
|
64
67
|
export { useAblo, } from './useAblo.js';
|
|
65
68
|
// ── ModelScope re-export ───────────────────────────────────────────
|
|
66
|
-
export { ModelScope } from '../types/index.js';
|
|
69
|
+
export { ModelScope } from '../transaction/types/index.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Ablo } from '../client/Ablo.js';
|
|
2
|
-
import type { SchemaRecord } from '../schema/schema.js';
|
|
2
|
+
import type { SchemaRecord } from '../transaction/schema/schema.js';
|
|
3
3
|
/**
|
|
4
4
|
* The context that `<AbloProvider>` populates for its own hooks. It is kept
|
|
5
5
|
* separate from the data-hook context, which carries the store and schema,
|
package/dist/react/useAblo.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Ablo, AbloReads, ModelClaim } from '../client/Ablo.js';
|
|
2
2
|
import type { ModelOperations } from '../client/createModelProxy.js';
|
|
3
|
-
import type { SchemaRecord } from '../schema/schema.js';
|
|
4
|
-
import type { ResolveSchema } from '../types/global.js';
|
|
3
|
+
import type { SchemaRecord } from '../transaction/schema/schema.js';
|
|
4
|
+
import type { ResolveSchema } from '../transaction/types/global.js';
|
|
5
5
|
/**
|
|
6
6
|
* The app's resolved schema-record type. It reads your `Register` module
|
|
7
7
|
* augmentation when you declare one and falls back to the loose
|
|
@@ -11,8 +11,8 @@ import type { ResolveSchema } from '../types/global.js';
|
|
|
11
11
|
type DefaultModels = ResolveSchema extends {
|
|
12
12
|
models: infer M;
|
|
13
13
|
} ? M extends SchemaRecord ? M : SchemaRecord : SchemaRecord;
|
|
14
|
-
type ModelClientSelector<R extends SchemaRecord, T, C> = (ablo: AbloReads<R>) => ModelOperations<T, C>;
|
|
15
|
-
type AbloSelector<R extends SchemaRecord, T> = (ablo: AbloReads<R>) => T;
|
|
14
|
+
export type ModelClientSelector<R extends SchemaRecord, T, C> = (ablo: AbloReads<R>) => ModelOperations<T, C>;
|
|
15
|
+
export type AbloSelector<R extends SchemaRecord, T> = (ablo: AbloReads<R>) => T;
|
|
16
16
|
export interface UseAbloModelOptions<T> {
|
|
17
17
|
/**
|
|
18
18
|
* An initial row, usually from a server component or a route loader. The hook
|
|
@@ -42,6 +42,13 @@ export type UseAbloHydratedModelResult<T> = Omit<UseAbloModelResult<T>, 'data'>
|
|
|
42
42
|
* Schema: typeof schema } }`); the default type then resolves through your
|
|
43
43
|
* schema's models, so call sites stay clean:
|
|
44
44
|
*
|
|
45
|
+
* **Prefer the binding.** `createAbloReact(schema)` captures the schema once
|
|
46
|
+
* in your app's binding file and returns a `useAblo` that needs none of the
|
|
47
|
+
* typing arrangements below — no type argument, no `Register` declaration
|
|
48
|
+
* (see `react.md`). Passing an explicit schema type argument to THIS hook is
|
|
49
|
+
* deprecated in favor of that binding; it keeps working for shared packages
|
|
50
|
+
* that cannot bind a concrete schema.
|
|
51
|
+
*
|
|
45
52
|
* ```ts
|
|
46
53
|
* // With the Register augmentation (recommended):
|
|
47
54
|
* const ablo = useAblo();
|
|
@@ -51,7 +58,7 @@ export type UseAbloHydratedModelResult<T> = Omit<UseAbloModelResult<T>, 'data'>
|
|
|
51
58
|
* // Reactive selector (a synchronous local snapshot). The selector's reads
|
|
52
59
|
* // are typed as snapshot rows — data fields + computeds, no relation
|
|
53
60
|
* // accessors — matching what the hook actually returns:
|
|
54
|
-
* const doc = useAblo((ablo) => ablo.documents.
|
|
61
|
+
* const doc = useAblo((ablo) => ablo.documents.local.retrieve(id)) ?? serverDoc;
|
|
55
62
|
* const active = useAblo((ablo) => ablo.documents.claim.state({ id }));
|
|
56
63
|
*
|
|
57
64
|
* // Without the augmentation, pass the schema as a type argument:
|
package/dist/react/useAblo.js
CHANGED
|
@@ -15,19 +15,19 @@ function rebindEngine(engine) {
|
|
|
15
15
|
return engine;
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
* The
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* The reactive-read view of a client — the identical runtime object, with
|
|
19
|
+
* model reads typed as snapshot rows, because everything a selector returns
|
|
20
|
+
* is converted through `snapshotValue` before the hook hands it back. Same
|
|
21
|
+
* generic in and out, so this compiles with no schema rebinding.
|
|
22
22
|
*/
|
|
23
23
|
function reactiveReads(engine) {
|
|
24
|
-
return
|
|
24
|
+
return engine;
|
|
25
25
|
}
|
|
26
26
|
function readModelResult(engine, modelClient, id, initial) {
|
|
27
27
|
if (!modelClient || id === undefined) {
|
|
28
28
|
return { data: initial, claims: EMPTY_CLAIMS, claimed: false };
|
|
29
29
|
}
|
|
30
|
-
const data = snapshotValue(modelClient.
|
|
30
|
+
const data = snapshotValue(modelClient.local.retrieve(id) ?? initial);
|
|
31
31
|
const meta = getModelClientMeta(modelClient);
|
|
32
32
|
const claims = meta && engine
|
|
33
33
|
? engine.claims.list({ model: meta.key, id })
|
|
@@ -55,8 +55,26 @@ function snapshotValue(value) {
|
|
|
55
55
|
return value;
|
|
56
56
|
}
|
|
57
57
|
export function useAblo(modelOrSelect, id, options) {
|
|
58
|
+
return useAbloImpl(null, modelOrSelect, id, options);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* @internal The one implementation behind `useAblo` and the bound hooks a
|
|
62
|
+
* `createAbloReact` binding returns — written once so the reactive read path
|
|
63
|
+
* cannot fork between the global hook and a factory's.
|
|
64
|
+
*
|
|
65
|
+
* `boundClient` is a binding's own context value — typed `Ablo<S>` at the
|
|
66
|
+
* factory, so that path never rebinds and never casts. `null` means "no
|
|
67
|
+
* binding provider in this tree": the global hook always passes it, and a
|
|
68
|
+
* binding hook mounted under a legacy provider falls through to the erased
|
|
69
|
+
* internal context, which is what keeps both mounts working while the last
|
|
70
|
+
* legacy mount migrates.
|
|
71
|
+
*/
|
|
72
|
+
export function useAbloImpl(boundClient, modelOrSelect, id, options) {
|
|
58
73
|
const ctx = useContext(AbloInternalContext);
|
|
59
|
-
|
|
74
|
+
// The bound client wins — it is already `Ablo<R>`, no rebinding. The
|
|
75
|
+
// fallback is the ONE remaining schema rebind in the SDK; it retires with
|
|
76
|
+
// the last legacy provider mount (docs/plans/typed-react-binding.md).
|
|
77
|
+
const engine = boundClient ?? (ctx?.engine ? rebindEngine(ctx.engine) : null);
|
|
60
78
|
const initial = options?.initial;
|
|
61
79
|
const isSelectorOnly = typeof modelOrSelect === 'function' && id === undefined;
|
|
62
80
|
const modelClient = typeof modelOrSelect === 'function' && id !== undefined
|
|
@@ -98,5 +116,5 @@ export function useAblo(modelOrSelect, id, options) {
|
|
|
98
116
|
return selected;
|
|
99
117
|
if (modelOrSelect)
|
|
100
118
|
return modelResult;
|
|
101
|
-
return engine
|
|
119
|
+
return engine;
|
|
102
120
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useContext } from 'react';
|
|
3
3
|
import { AbloInternalContext } from './internalContext.js';
|
|
4
|
-
import { AbloValidationError } from '../errors.js';
|
|
4
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
5
5
|
/**
|
|
6
6
|
* Returns the application user id passed to the nearest `<AbloProvider>`, or
|
|
7
7
|
* `null` when your app did not provide one.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useContext, useEffect, useRef } from 'react';
|
|
3
3
|
import { AbloInternalContext } from './internalContext.js';
|
|
4
|
-
import { AbloValidationError } from '../errors.js';
|
|
4
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
5
5
|
/**
|
|
6
6
|
* Registers a callback that runs whenever the provider surfaces an error. This
|
|
7
7
|
* covers engine errors such as bootstrap failures and mutation rejections,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { QueuedMutation } from '../transactions/mutations/MutationQueue.js';
|
|
2
2
|
export interface MutationFailurePayload {
|
|
3
|
-
transaction:
|
|
3
|
+
transaction: QueuedMutation;
|
|
4
4
|
error: Error;
|
|
5
5
|
permanent?: boolean;
|
|
6
6
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useContext, useEffect, useRef } from 'react';
|
|
3
3
|
import { AbloInternalContext } from './internalContext.js';
|
|
4
|
-
import { AbloValidationError } from '../errors.js';
|
|
4
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
5
5
|
/**
|
|
6
6
|
* Subscribes a listener to mutation failures. The callback fires whenever the
|
|
7
7
|
* transaction queue rolls back an optimistic write — both permanent rejections
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { Schema } from '../schema/schema.js';
|
|
1
|
+
import type { Schema } from '../transaction/schema/schema.js';
|
|
2
2
|
import type { MutatorDefs } from '../mutators/defineMutators.js';
|
|
3
3
|
import type { UndoScope } from '../mutators/UndoManager.js';
|
|
4
|
-
import type { ResolveSchema } from '../types/global.js';
|
|
4
|
+
import type { ResolveSchema } from '../transaction/types/global.js';
|
|
5
5
|
/**
|
|
6
6
|
* Turns a mutator tree built with `defineMutators` into callable invokers. The
|
|
7
7
|
* returned object mirrors that tree one-to-one, but each leaf becomes an
|
|
@@ -41,7 +41,7 @@ export type MutatorInvokers<M> = {
|
|
|
41
41
|
};
|
|
42
42
|
/**
|
|
43
43
|
* Options passed to `useMutators`. When `undoScope` is set, every mutator
|
|
44
|
-
* invocation is wrapped in a `
|
|
44
|
+
* invocation is wrapped in a `RecordingMutation` and its inverses are
|
|
45
45
|
* pushed to the scope as one undo entry.
|
|
46
46
|
*/
|
|
47
47
|
export interface UseMutatorsOptions<S extends Schema> {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
3
|
import { createTransaction } from '../mutators/Transaction.js';
|
|
4
|
-
import {
|
|
4
|
+
import { createRecordingMutation } from '../mutators/RecordingMutation.js';
|
|
5
5
|
import { useSyncContext } from './context.js';
|
|
6
|
-
import { AbloValidationError } from '../errors.js';
|
|
6
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
7
7
|
import { getContext } from '../context.js';
|
|
8
8
|
export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
|
|
9
9
|
const { store, organizationId, schema: ctxSchema } = useSyncContext();
|
|
@@ -48,7 +48,7 @@ export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
|
|
|
48
48
|
// interleave their shared-model snapshots. See UndoScope.runRecorded.
|
|
49
49
|
if (undoScope) {
|
|
50
50
|
return undoScope.runRecorded(async () => {
|
|
51
|
-
const recording =
|
|
51
|
+
const recording = createRecordingMutation(schema, store, organizationId);
|
|
52
52
|
try {
|
|
53
53
|
const result = await fn({ tx: recording.tx, args });
|
|
54
54
|
const entry = recording.getEntry(label);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { Schema } from '../schema/schema.js';
|
|
1
|
+
import type { Schema } from '../transaction/schema/schema.js';
|
|
2
2
|
import type { UndoScope, UndoScopeOptions } from '../mutators/UndoManager.js';
|
|
3
|
-
import type { ResolveSchema } from '../types/global.js';
|
|
3
|
+
import type { ResolveSchema } from '../transaction/types/global.js';
|
|
4
4
|
/**
|
|
5
5
|
* Provides per-surface undo and redo for mutator invocations. Each named scope
|
|
6
|
-
* owns an independent undo/redo stack, so different parts of your app — a
|
|
6
|
+
* owns an independent undo/redo stack, so different parts of your app — a main
|
|
7
7
|
* editor, a sidebar form — can undo separately without stepping on each other.
|
|
8
8
|
*
|
|
9
9
|
* Wire the returned `scope` into `useMutators(schema, mutators, { undoScope:
|
|
@@ -12,8 +12,8 @@ import type { ResolveSchema } from '../types/global.js';
|
|
|
12
12
|
* themselves; the manager moves the entry between the two stacks explicitly.
|
|
13
13
|
*
|
|
14
14
|
* @example
|
|
15
|
-
* const { undo, redo, canUndo, canRedo, scope } = useUndoScope('
|
|
16
|
-
* const mutate = useMutators(schema,
|
|
15
|
+
* const { undo, redo, canUndo, canRedo, scope } = useUndoScope('report-editor');
|
|
16
|
+
* const mutate = useMutators(schema, reportMutators, { undoScope: scope });
|
|
17
17
|
*
|
|
18
18
|
* // Cmd+Z handler
|
|
19
19
|
* useHotkey('mod+z', () => { if (canUndo) void undo(); });
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { useEffect, useMemo, useState } from 'react';
|
|
3
3
|
import { UndoManager } from '../mutators/UndoManager.js';
|
|
4
4
|
import { useSyncContext } from './context.js';
|
|
5
|
-
import { AbloValidationError } from '../errors.js';
|
|
5
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
6
6
|
// Module-level weak registry: `SyncStoreContract` → `UndoManager`.
|
|
7
7
|
// A single app wiring through one SyncProvider shares one manager across
|
|
8
8
|
// every useUndoScope call, so scopes with the same name are identity-equal.
|