@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
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `humans()` — the reactive materialiser, declared as a capability (ADR 0016).
|
|
3
|
+
*
|
|
4
|
+
* The bare client is the coordination layer: commit, read, observe, claim.
|
|
5
|
+
* Add `humans()` when people are watching — it declares the local, watchable
|
|
6
|
+
* copy: the offline store, live queries, presence, and the framework
|
|
7
|
+
* bindings. There is no `agents()` counterpart, and the absence is the
|
|
8
|
+
* message: agents are the default caller, not a special one.
|
|
9
|
+
*
|
|
10
|
+
* Transitional shape: the contract fields do real configuration work
|
|
11
|
+
* (`requires.duplex` rejects it on a request-response client at construction
|
|
12
|
+
* time; `materialises` is the five-second membership test as a checkable
|
|
13
|
+
* property), and `init` constructs what the widened context carries enough
|
|
14
|
+
* to build — the presence stream, attached to the connection the context
|
|
15
|
+
* carries, and the store cluster (this client's runtime, the component
|
|
16
|
+
* graph, the registered models, and the `BaseSyncedStore`), now that the
|
|
17
|
+
* context carries the resolved url and the credential source. What still
|
|
18
|
+
* lives in the composition root — the credential lifecycle, `ready()`, the
|
|
19
|
+
* model proxies, the resources, the framework bindings — migrates here as
|
|
20
|
+
* the context grows to carry what it needs.
|
|
21
|
+
*/
|
|
22
|
+
import type { PluginContext, AppliedChange } from '../transaction/plugin.js';
|
|
23
|
+
import type { SchemaRecord } from '../transaction/schema/schema.js';
|
|
24
|
+
import { type AttachablePresenceStream } from '../sync/createPresenceStream.js';
|
|
25
|
+
import { kStoreCluster, type StoreCluster } from './storeCluster.js';
|
|
26
|
+
import type { InternalAbloOptions } from './options.js';
|
|
27
|
+
/**
|
|
28
|
+
* What `humans()` contributes to the client — exactly the members that merge
|
|
29
|
+
* onto it, nothing else. Whether a plugin materialises is declared on the
|
|
30
|
+
* plugin itself, never restated on its surface.
|
|
31
|
+
*
|
|
32
|
+
* The one exception is deliberate and invisible to merging:
|
|
33
|
+
* {@link kStoreCluster} is symbol-keyed, and surface members merge onto the
|
|
34
|
+
* client by string key alone — so the cluster reaches the host without ever
|
|
35
|
+
* becoming client API.
|
|
36
|
+
*/
|
|
37
|
+
export interface HumansSurface {
|
|
38
|
+
/**
|
|
39
|
+
* Who is here and what they are doing. Attached to the connection at
|
|
40
|
+
* construction; calls before the socket opens mutate local state and skip
|
|
41
|
+
* the wire send, and the stream re-announces on every connect.
|
|
42
|
+
*/
|
|
43
|
+
readonly presence: AttachablePresenceStream;
|
|
44
|
+
/**
|
|
45
|
+
* The constructed store cluster, when the context carried enough to build
|
|
46
|
+
* it (the connection, the resolved url, the credential source, and a
|
|
47
|
+
* schema). Absent on a thinner context — the presence stream's own
|
|
48
|
+
* tolerance, applied to the store.
|
|
49
|
+
*/
|
|
50
|
+
readonly [kStoreCluster]?: StoreCluster;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The reactive materialiser. Installed by default when `Ablo({ ... })` is
|
|
54
|
+
* constructed over the socket with no `plugins` list; listed explicitly, it
|
|
55
|
+
* reads as what it is — this client renders for people.
|
|
56
|
+
*/
|
|
57
|
+
export declare function humans(): {
|
|
58
|
+
readonly id: "humans";
|
|
59
|
+
readonly requires: {
|
|
60
|
+
readonly duplex: true;
|
|
61
|
+
};
|
|
62
|
+
readonly materialises: true;
|
|
63
|
+
readonly stages: {
|
|
64
|
+
readonly apply: ({ changes }: {
|
|
65
|
+
readonly changes: readonly AppliedChange[];
|
|
66
|
+
}) => void;
|
|
67
|
+
};
|
|
68
|
+
readonly init: (context: PluginContext<InternalAbloOptions<SchemaRecord>>) => HumansSurface;
|
|
69
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `humans()` — the reactive materialiser, declared as a capability (ADR 0016).
|
|
3
|
+
*
|
|
4
|
+
* The bare client is the coordination layer: commit, read, observe, claim.
|
|
5
|
+
* Add `humans()` when people are watching — it declares the local, watchable
|
|
6
|
+
* copy: the offline store, live queries, presence, and the framework
|
|
7
|
+
* bindings. There is no `agents()` counterpart, and the absence is the
|
|
8
|
+
* message: agents are the default caller, not a special one.
|
|
9
|
+
*
|
|
10
|
+
* Transitional shape: the contract fields do real configuration work
|
|
11
|
+
* (`requires.duplex` rejects it on a request-response client at construction
|
|
12
|
+
* time; `materialises` is the five-second membership test as a checkable
|
|
13
|
+
* property), and `init` constructs what the widened context carries enough
|
|
14
|
+
* to build — the presence stream, attached to the connection the context
|
|
15
|
+
* carries, and the store cluster (this client's runtime, the component
|
|
16
|
+
* graph, the registered models, and the `BaseSyncedStore`), now that the
|
|
17
|
+
* context carries the resolved url and the credential source. What still
|
|
18
|
+
* lives in the composition root — the credential lifecycle, `ready()`, the
|
|
19
|
+
* model proxies, the resources, the framework bindings — migrates here as
|
|
20
|
+
* the context grows to carry what it needs.
|
|
21
|
+
*/
|
|
22
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
23
|
+
import { createPresenceStream, } from '../sync/createPresenceStream.js';
|
|
24
|
+
import { buildStoreCluster, kStoreCluster, } from './storeCluster.js';
|
|
25
|
+
/**
|
|
26
|
+
* The reactive materialiser. Installed by default when `Ablo({ ... })` is
|
|
27
|
+
* constructed over the socket with no `plugins` list; listed explicitly, it
|
|
28
|
+
* reads as what it is — this client renders for people.
|
|
29
|
+
*/
|
|
30
|
+
export function humans() {
|
|
31
|
+
// The apply handler's target. `init` binds it to the store it constructs;
|
|
32
|
+
// until then the handler is a no-op, and nothing dispatches before then —
|
|
33
|
+
// the store itself is the pipeline that dispatches.
|
|
34
|
+
let applyChanges = null;
|
|
35
|
+
return {
|
|
36
|
+
id: 'humans',
|
|
37
|
+
// Live queries, presence, and claim push are server-initiated frames, so
|
|
38
|
+
// a request-response client rejects this plugin while it is being
|
|
39
|
+
// configured — a typed error, not a subscription that never delivers.
|
|
40
|
+
requires: { duplex: true },
|
|
41
|
+
// The point of the plugin: it keeps a local copy of rows. A stateless
|
|
42
|
+
// caller can assert its own list is uniformly false.
|
|
43
|
+
materialises: true,
|
|
44
|
+
stages: {
|
|
45
|
+
// Deltas land in the materialised in-memory graph at `apply` — the
|
|
46
|
+
// declaration and the handler are one field, so this cannot name a
|
|
47
|
+
// stage and forget the work.
|
|
48
|
+
apply: ({ changes }) => { applyChanges?.(changes); },
|
|
49
|
+
},
|
|
50
|
+
init: (context) => {
|
|
51
|
+
const cluster = buildStoreCluster(context);
|
|
52
|
+
if (cluster) {
|
|
53
|
+
// One client per humans() instance: the apply handler routes into
|
|
54
|
+
// the store this init built, so a shared instance would silently
|
|
55
|
+
// apply one client's deltas into another client's store.
|
|
56
|
+
if (applyChanges) {
|
|
57
|
+
throw new AbloValidationError('This humans() instance is already installed on a client. ' +
|
|
58
|
+
'Construct a fresh humans() for each Ablo({ ... }) call.', { code: 'invalid_options', param: 'plugins' });
|
|
59
|
+
}
|
|
60
|
+
applyChanges = (changes) => { cluster.store.applyChangesToPool(changes); };
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
presence: createPresenceStream({
|
|
64
|
+
participantId: context.participant?.id ?? '',
|
|
65
|
+
syncGroups: [...(context.syncGroups ?? [])],
|
|
66
|
+
// Peers' kinds are server-stamped; only the local `self` entry is ours.
|
|
67
|
+
isAgent: context.participant?.kind === 'agent',
|
|
68
|
+
},
|
|
69
|
+
// The host built the connection before resolving the plugin list, so
|
|
70
|
+
// the stream attaches now and starts the moment the feed opens.
|
|
71
|
+
context.transport ?? null),
|
|
72
|
+
...(cluster ? { [kStoreCluster]: cluster } : {}),
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
// `satisfies` rather than a return annotation, so `id` keeps its literal
|
|
76
|
+
// type and a plugin list's surface can be keyed by id at the type level.
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* and opt-in field-level reactivity) and registers the model's properties,
|
|
6
6
|
* relations, and any local-database indexes.
|
|
7
7
|
*/
|
|
8
|
-
import type { Schema } from '../schema/schema.js';
|
|
8
|
+
import type { Schema } from '../transaction/schema/schema.js';
|
|
9
9
|
import type { ModelRegistry } from '../ModelRegistry.js';
|
|
10
10
|
export declare function registerModelsFromSchema(schema: Schema, registry: ModelRegistry): void;
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* relations, and any local-database indexes.
|
|
7
7
|
*/
|
|
8
8
|
import { z } from 'zod';
|
|
9
|
-
import { baseFieldsSchema } from '../schema/schema.js';
|
|
9
|
+
import { baseFieldsSchema } from '../transaction/schema/schema.js';
|
|
10
10
|
import { Model } from '../Model.js';
|
|
11
|
-
import {
|
|
11
|
+
import { PropertyType } from '../transaction/types/index.js';
|
|
12
12
|
// ── Auto model registration from schema ───────────────────────────────────
|
|
13
13
|
export function registerModelsFromSchema(schema, registry) {
|
|
14
14
|
registry.startBatch();
|
|
@@ -50,10 +50,10 @@ export function registerModelsFromSchema(schema, registry) {
|
|
|
50
50
|
];
|
|
51
51
|
const computed = modelDef.computed;
|
|
52
52
|
const DynamicModel = createDynamicModelClass(modelName, jsonSubFields, fieldNames, computed, isLazy);
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
// The schema's strategy carries straight through — authoring and runtime
|
|
54
|
+
// name the same set, so there is nothing here to translate and nothing to
|
|
55
|
+
// fall out of step. Lazy models skip IDB hydration and bootstrap.
|
|
56
|
+
const loadStrategy = modelDef.load;
|
|
57
57
|
registry.registerModel(modelName, DynamicModel, {
|
|
58
58
|
loadStrategy,
|
|
59
59
|
fields: modelDef.fields,
|
|
@@ -70,14 +70,14 @@ export function registerModelsFromSchema(schema, registry) {
|
|
|
70
70
|
// id, and indexing every scalar is worse still.
|
|
71
71
|
const indexedFields = new Set();
|
|
72
72
|
for (const relDef of Object.values(modelDef.relations)) {
|
|
73
|
-
if (relDef.type === 'belongsTo' && relDef.foreignKey && relDef.options
|
|
73
|
+
if (relDef.type === 'belongsTo' && relDef.foreignKey && relDef.options.index === true) {
|
|
74
74
|
indexedFields.add(relDef.foreignKey);
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
// Register fields as properties (from Zod shape).
|
|
78
78
|
for (const [fieldName, rawZodType] of Object.entries(modelDef.shape)) {
|
|
79
79
|
const zodType = rawZodType;
|
|
80
|
-
const isOptional = zodType.isOptional
|
|
80
|
+
const isOptional = zodType.isOptional();
|
|
81
81
|
// A field is indexed if it is the foreign key of a
|
|
82
82
|
// `belongsTo({ index: true })` relation. A `description === 'indexed'` tag
|
|
83
83
|
// also works, for consumers using the `field.*().indexed()` builder.
|
|
@@ -87,7 +87,7 @@ export function registerModelsFromSchema(schema, registry) {
|
|
|
87
87
|
// would walk every nested property and create an atom per leaf, producing a
|
|
88
88
|
// storm of updates on each commit or streaming change. Reference tracking
|
|
89
89
|
// watches only reassignment, which is how blob consumers actually use them.
|
|
90
|
-
const wireType = modelDef.fields
|
|
90
|
+
const wireType = modelDef.fields[fieldName]?.type;
|
|
91
91
|
const observability = wireType === 'json' ? 'ref' : undefined;
|
|
92
92
|
registry.registerProperty(modelName, fieldName, {
|
|
93
93
|
type: PropertyType.property,
|
package/dist/client/options.d.ts
CHANGED
|
@@ -4,19 +4,21 @@
|
|
|
4
4
|
* construction surface exposed through `@abloatai/ablo/core`.
|
|
5
5
|
* This module holds only types and has no runtime imports.
|
|
6
6
|
*/
|
|
7
|
-
import type { Schema, SchemaRecord } from '../schema/schema.js';
|
|
8
|
-
import type {
|
|
9
|
-
import type { AbloPersistence } from '
|
|
10
|
-
import type { DurableWriteStore, DurableWritesConfig } from '../
|
|
11
|
-
import type { CommitOutboxScope } from '../transactions/commitEnvelope.js';
|
|
7
|
+
import type { Schema, SchemaRecord } from '../transaction/schema/schema.js';
|
|
8
|
+
import type { RuntimeConfig, Logger, MutationExecutor, ObservabilityProvider, Analytics, SessionErrorDetector, OnlineStatusProvider } from '../interfaces/index.js';
|
|
9
|
+
import type { AbloPersistence } from '../transaction/persistence.js';
|
|
10
|
+
import type { DurableWriteStore, DurableWritesConfig } from '../transaction/durableWrites.js';
|
|
11
|
+
import type { CommitOutboxScope } from '../transaction/transactions/settlement/commitEnvelope.js';
|
|
12
12
|
/**
|
|
13
13
|
* An async function that resolves an apiKey at request time. Use it for credential
|
|
14
14
|
* rotation — read from a vault, refresh from session storage, or pull from an
|
|
15
15
|
* existing auth session. The canonical definition lives in `./auth`; it is
|
|
16
16
|
* re-exported here for convenience.
|
|
17
17
|
*/
|
|
18
|
-
export type { ApiKeySetter } from '
|
|
19
|
-
import type { ApiKeySetter } from '
|
|
18
|
+
export type { ApiKeySetter } from '../transaction/auth/apiKey.js';
|
|
19
|
+
import type { ApiKeySetter } from '../transaction/auth/apiKey.js';
|
|
20
|
+
import type { AbloPlugin } from '../transaction/plugin.js';
|
|
21
|
+
import type { ParticipantKind } from '../transaction/types/participant.js';
|
|
20
22
|
/**
|
|
21
23
|
* Options for the {@link Ablo} client.
|
|
22
24
|
*
|
|
@@ -39,6 +41,13 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
39
41
|
* pass; start here.
|
|
40
42
|
*/
|
|
41
43
|
schema: Schema<S>;
|
|
44
|
+
/**
|
|
45
|
+
* The capabilities installed on this client. Each plugin appears once in
|
|
46
|
+
* the list; a duplicate, or a plugin the chosen transport cannot carry,
|
|
47
|
+
* fails while the client is being constructed with an error naming the
|
|
48
|
+
* plugin. Omitted, the client installs `humans()` — today's default.
|
|
49
|
+
*/
|
|
50
|
+
plugins?: readonly AbloPlugin[];
|
|
42
51
|
/**
|
|
43
52
|
* The API key — the auth field most apps set. It accepts three shapes:
|
|
44
53
|
*
|
|
@@ -117,6 +126,15 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
117
126
|
* })
|
|
118
127
|
* ```
|
|
119
128
|
*/
|
|
129
|
+
/**
|
|
130
|
+
* Wire message types to surface as collaboration events, e.g.
|
|
131
|
+
* `['document:selection', 'document:cursor']`.
|
|
132
|
+
*
|
|
133
|
+
* These name your application's own concepts, so the SDK ships no default —
|
|
134
|
+
* a schema with no documents should never receive document events. Declare
|
|
135
|
+
* the ones you broadcast.
|
|
136
|
+
*/
|
|
137
|
+
collaborationEvents?: readonly string[];
|
|
120
138
|
durableWrites?: DurableWritesConfig;
|
|
121
139
|
/**
|
|
122
140
|
* @deprecated Use `durableWrites: { store, namespace }`.
|
|
@@ -142,8 +160,8 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
142
160
|
* serverless handlers. It offers the same `ablo.<model>` surface and coordination
|
|
143
161
|
* plane, but every call is a single HTTP round-trip, identity rides the bearer
|
|
144
162
|
* credential, and no socket is opened. With `'http'` the return type narrows to
|
|
145
|
-
* {@link AbloHttpClient}, so stateful-only capabilities such as
|
|
146
|
-
* and `onChange` become compile errors instead of runtime gaps.
|
|
163
|
+
* {@link AbloHttpClient}, so stateful-only capabilities such as the `local`
|
|
164
|
+
* reads and `onChange` become compile errors instead of runtime gaps.
|
|
147
165
|
*
|
|
148
166
|
* Session minting through `sessions.create` is available on both transports.
|
|
149
167
|
*
|
|
@@ -154,12 +172,18 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
154
172
|
* Turns Ablo's diagnostic logging on or off. `true` surfaces the `[Ablo]`
|
|
155
173
|
* coordination trace — claims requested, queued, granted, and released, agent
|
|
156
174
|
* handovers, and connection state — so you can watch the coordination between
|
|
157
|
-
*
|
|
175
|
+
* agents and people while debugging. Omitting it, or `false`, keeps the quiet
|
|
158
176
|
* default of warnings and errors only. For a middle ground use {@link logLevel}.
|
|
159
177
|
* The `ABLO_LOG_LEVEL` environment variable overrides it, and a custom logger
|
|
160
178
|
* takes precedence.
|
|
161
179
|
*/
|
|
162
180
|
debug?: boolean | undefined;
|
|
181
|
+
/**
|
|
182
|
+
* Route Ablo's log lines through your own logger (pino, winston, a test spy)
|
|
183
|
+
* instead of the default console `[Ablo]` logger. Supplying one bypasses
|
|
184
|
+
* {@link debug}/{@link logLevel} — your logger owns the thresholds.
|
|
185
|
+
*/
|
|
186
|
+
logger?: Logger;
|
|
163
187
|
/**
|
|
164
188
|
* The log threshold for the default `[Ablo]` logger; takes precedence over
|
|
165
189
|
* {@link debug}. `'info'` shows coordination and connection events without the
|
|
@@ -189,6 +213,33 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
189
213
|
* session token (`ek_`/`rk_`) or you route through a controlled server proxy.
|
|
190
214
|
*/
|
|
191
215
|
dangerouslyAllowBrowser?: boolean | undefined;
|
|
216
|
+
/**
|
|
217
|
+
* How far a write goes before its promise settles, for every model write on
|
|
218
|
+
* this client. The same word each write already takes per call
|
|
219
|
+
* (`create({ …, wait: 'confirmed' })`); setting it here makes it the default
|
|
220
|
+
* instead of repeating it.
|
|
221
|
+
*
|
|
222
|
+
* A write resolves as soon as it is applied locally and queued. That is what
|
|
223
|
+
* makes the UI immediate, and it is right for most writes — but it means a
|
|
224
|
+
* write the server later REFUSES has no caller left to tell. The rejection
|
|
225
|
+
* reverts the local row and reaches `ablo.onMutationFailure(…)`, and an
|
|
226
|
+
* application that subscribes to neither shows the change, then loses it,
|
|
227
|
+
* with nothing thrown anywhere.
|
|
228
|
+
*
|
|
229
|
+
* ```ts
|
|
230
|
+
* const ablo = new Ablo({ schema, apiKey, wait: 'confirmed' });
|
|
231
|
+
* try {
|
|
232
|
+
* await ablo.documents.update({ id, data }); // throws if refused
|
|
233
|
+
* } catch (err) {
|
|
234
|
+
* if (err instanceof AbloError) show(err.message);
|
|
235
|
+
* }
|
|
236
|
+
* ```
|
|
237
|
+
*
|
|
238
|
+
* The cost is real: each write now waits for the server's answer, so it is a
|
|
239
|
+
* choice between immediacy and certainty rather than a strict improvement.
|
|
240
|
+
* A per-call `wait` still wins over this.
|
|
241
|
+
*/
|
|
242
|
+
wait?: 'queued' | 'confirmed' | undefined;
|
|
192
243
|
}
|
|
193
244
|
export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
194
245
|
/**
|
|
@@ -257,7 +308,7 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
257
308
|
* @deprecated The server derives the participant kind from the apiKey's scope.
|
|
258
309
|
* Pass `apiKey` only.
|
|
259
310
|
*/
|
|
260
|
-
kind?:
|
|
311
|
+
kind?: ParticipantKind;
|
|
261
312
|
/**
|
|
262
313
|
* @deprecated The server derives user identity from the apiKey's scope, or from
|
|
263
314
|
* the `Ablo-Acting-User` request header for multi-tenant setups. Pass `apiKey`
|
|
@@ -277,12 +328,12 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
277
328
|
*/
|
|
278
329
|
capabilityToken?: string;
|
|
279
330
|
/** Custom logger (default: console). Supplying one bypasses {@link debug}/{@link logLevel}. */
|
|
280
|
-
logger?:
|
|
331
|
+
logger?: Logger;
|
|
281
332
|
/**
|
|
282
333
|
* Turns Ablo's diagnostic logging on or off. `true` surfaces the `[Ablo]`
|
|
283
334
|
* coordination trace — claims acquired, queued, granted, and released, agent
|
|
284
335
|
* handovers, and connection state — along with internal lifecycle events, so you
|
|
285
|
-
* can watch the coordination between
|
|
336
|
+
* can watch the coordination between agents and people. Omitting it, or `false`,
|
|
286
337
|
* keeps the quiet default of warnings and errors only. For a middle ground use
|
|
287
338
|
* {@link logLevel}. The `ABLO_LOG_LEVEL` environment variable overrides it, and a
|
|
288
339
|
* custom {@link logger} takes precedence.
|
|
@@ -307,6 +358,8 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
307
358
|
*/
|
|
308
359
|
persistence?: AbloPersistence;
|
|
309
360
|
/** Internal mirror of {@link AbloOptions.durableWrites}. */
|
|
361
|
+
/** Wire message types to surface as collaboration events. Empty unless declared. */
|
|
362
|
+
collaborationEvents?: readonly string[];
|
|
310
363
|
durableWrites?: DurableWritesConfig;
|
|
311
364
|
/** @deprecated Internal mirror of {@link AbloOptions.commitOutbox}. */
|
|
312
365
|
commitOutbox?: DurableWriteStore;
|
|
@@ -344,12 +397,12 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
344
397
|
* Custom observability provider (Sentry, Honeycomb, OTel, etc.).
|
|
345
398
|
* Default: a noop implementation that drops all breadcrumbs and spans.
|
|
346
399
|
*/
|
|
347
|
-
observability?:
|
|
400
|
+
observability?: ObservabilityProvider;
|
|
348
401
|
/**
|
|
349
402
|
* Custom analytics provider (PostHog, Amplitude, Segment, etc.).
|
|
350
403
|
* Default: a noop implementation that drops all events.
|
|
351
404
|
*/
|
|
352
|
-
analytics?:
|
|
405
|
+
analytics?: Analytics;
|
|
353
406
|
/**
|
|
354
407
|
* Detect whether an error from a mutation/bootstrap response means the
|
|
355
408
|
* user's session has expired. Used to surface re-auth prompts. Default:
|
|
@@ -371,12 +424,12 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
371
424
|
*/
|
|
372
425
|
mutationExecutor?: MutationExecutor;
|
|
373
426
|
/**
|
|
374
|
-
* Partial overrides for the auto-derived `
|
|
427
|
+
* Partial overrides for the auto-derived `RuntimeConfig`. Merged on
|
|
375
428
|
* top of `deriveConfigFromSchema(schema)`. Use this when you need
|
|
376
429
|
* specific `modelCreatePriority`, `batchableModels`, or
|
|
377
430
|
* `essentialFields` settings that the schema cannot express.
|
|
378
431
|
*/
|
|
379
|
-
configOverrides?: Partial<
|
|
432
|
+
configOverrides?: Partial<RuntimeConfig>;
|
|
380
433
|
/**
|
|
381
434
|
* The sync groups (entity scopes) this client subscribes to. Normally the server
|
|
382
435
|
* derives these from the apiKey's scope; pass them explicitly when the key does
|
|
@@ -402,4 +455,7 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
|
|
|
402
455
|
* identity from the token through the identity endpoint instead.
|
|
403
456
|
*/
|
|
404
457
|
organizationId?: string;
|
|
458
|
+
/** The client-wide write default — see {@link AbloOptions.wait}. Projected
|
|
459
|
+
* from the public option rather than restated, so the two cannot diverge. */
|
|
460
|
+
wait?: AbloOptions['wait'];
|
|
405
461
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reactive engine assembly (ADR 0016). `Ablo({ ... })` resolves auth and
|
|
3
|
+
* capabilities; `humans().init` constructs the store cluster; the lifecycle
|
|
4
|
+
* — first mint, identity, ready() — lives in `./storeLifecycle.ts`. What
|
|
5
|
+
* remains here is assembly around those parts: the claim stream and
|
|
6
|
+
* participant manager, options validation, the typed model proxies, and the
|
|
7
|
+
* commit/claim/session resources — composed into the reactive client.
|
|
8
|
+
*
|
|
9
|
+
* Extracted from the factory so the composition root stays a root: resolve,
|
|
10
|
+
* dispatch, return. The remaining assembly converts to decoration of a
|
|
11
|
+
* host-built core client with the per-model surface split — the cut's own
|
|
12
|
+
* design step (docs/plans/package-split.md).
|
|
13
|
+
*/
|
|
14
|
+
import type { SchemaRecord } from '../transaction/schema/schema.js';
|
|
15
|
+
import type { StoreCluster } from './storeCluster.js';
|
|
16
|
+
import type { SyncWebSocket } from '../sync/SyncWebSocket.js';
|
|
17
|
+
import type { AttachablePresenceStream } from '../sync/createPresenceStream.js';
|
|
18
|
+
import type { AbloOptions } from './options.js';
|
|
19
|
+
import type { ClientPrelude } from './clientPrelude.js';
|
|
20
|
+
import type { Ablo } from './Ablo.js';
|
|
21
|
+
/**
|
|
22
|
+
* What the reactive build is fed: the factory's pass over the options bag
|
|
23
|
+
* ({@link ClientPrelude} — auth, url, logging, identity, shared with the other
|
|
24
|
+
* client shapes), plus the four things that must exist before the store does.
|
|
25
|
+
*
|
|
26
|
+
* The prelude half is extended, never restated. A second copy of those fields
|
|
27
|
+
* would drift the moment one side gained a resolver the other did not.
|
|
28
|
+
*/
|
|
29
|
+
export interface ReactiveEngineInputs<S extends SchemaRecord> extends ClientPrelude<S> {
|
|
30
|
+
options: AbloOptions<S>;
|
|
31
|
+
/**
|
|
32
|
+
* The connection, constructed by the factory before the plugin list
|
|
33
|
+
* resolved — the same instance `PluginContext.transport` carries. The
|
|
34
|
+
* store takes it as a dependency and owns the lifecycle.
|
|
35
|
+
*/
|
|
36
|
+
transport: SyncWebSocket;
|
|
37
|
+
/** The humans() plugin's contribution — built by its `init`, already
|
|
38
|
+
* attached to the connection the context carried. */
|
|
39
|
+
presence: AttachablePresenceStream;
|
|
40
|
+
/**
|
|
41
|
+
* The store cluster `humans().init` constructed from the widened context:
|
|
42
|
+
* this client's runtime, the component graph, and the store. The engine
|
|
43
|
+
* assembles around it and constructs none of it.
|
|
44
|
+
*/
|
|
45
|
+
cluster: StoreCluster;
|
|
46
|
+
/**
|
|
47
|
+
* Constructs a sibling client (`ablo.agents.create(...)` mints a scoped key
|
|
48
|
+
* and builds a second engine with it). Injected by the factory — a direct
|
|
49
|
+
* import back into it would close a runtime cycle.
|
|
50
|
+
*/
|
|
51
|
+
createSibling: (options: AbloOptions<S>) => Ablo<S>;
|
|
52
|
+
}
|
|
53
|
+
export declare function buildReactiveEngine<const S extends SchemaRecord>(inputs: ReactiveEngineInputs<S>): Ablo<S>;
|