@abloatai/ablo 0.34.1 → 0.35.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 +674 -5
- package/README.md +39 -22
- package/dist/BaseSyncedStore.d.ts +152 -44
- package/dist/BaseSyncedStore.js +300 -184
- package/dist/Database.d.ts +9 -24
- package/dist/Database.js +37 -22
- package/dist/InstanceCache.d.ts +25 -4
- package/dist/InstanceCache.js +48 -15
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +6 -6
- package/dist/Model.js +10 -10
- package/dist/ModelRegistry.d.ts +4 -4
- package/dist/ModelRegistry.js +3 -3
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +42 -32
- package/dist/SyncClient.js +166 -110
- 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/cli.cjs +3344 -1073
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +118 -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 +4 -4
- package/dist/client/createInternalComponents.js +9 -8
- package/dist/client/createModelProxy.d.ts +78 -373
- package/dist/client/createModelProxy.js +114 -86
- package/dist/client/humans.d.ts +48 -0
- package/dist/client/humans.js +52 -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 +48 -0
- package/dist/client/reactiveEngine.js +910 -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/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 +9 -9
- package/dist/context.js +10 -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/DatabaseManager.js +1 -1
- package/dist/core/QueryView.d.ts +1 -1
- package/dist/core/QueryView.js +1 -1
- package/dist/core/StoreManager.d.ts +4 -23
- package/dist/core/StoreManager.js +5 -55
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +2 -2
- package/dist/core/storeContract.d.ts +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +227 -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 +40 -34
- package/dist/index.js +26 -20
- 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 +2 -2
- package/dist/query/client.js +4 -4
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +6 -8
- package/dist/react/AbloProvider.js +5 -7
- package/dist/react/context.d.ts +1 -1
- package/dist/react/context.js +1 -1
- package/dist/react/index.d.ts +5 -5
- package/dist/react/index.js +3 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +3 -3
- package/dist/react/useAblo.js +1 -1
- 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 +86 -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 +10 -10
- package/dist/schema/index.js +18 -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 +3 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +17 -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/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/footprint.d.ts +111 -0
- package/dist/source/footprint.js +0 -0
- 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/stores/ObjectStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.d.ts +1 -1
- package/dist/stores/SyncActionStore.js +2 -10
- 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 +123 -6
- package/dist/sync/BootstrapFetcher.js +492 -66
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +2 -2
- package/dist/sync/OnDemandLoader.js +60 -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/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 +1 -1
- package/dist/sync/participants.d.ts +5 -4
- package/dist/sync/participants.js +29 -22
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +21 -32
- package/dist/sync/schemas.js +26 -17
- 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/testing/fixtures/bootstrap.d.ts +1 -1
- package/dist/testing/fixtures/deltas.d.ts +1 -1
- package/dist/testing/fixtures/httpResponses.d.ts +70 -0
- package/dist/testing/fixtures/httpResponses.js +90 -0
- package/dist/testing/fixtures/models.js +1 -1
- package/dist/testing/helpers/wait.js +1 -1
- package/dist/testing/mocks/MockMutationExecutor.d.ts +2 -2
- package/dist/testing/mocks/MockMutationExecutor.js +8 -14
- package/dist/testing/mocks/MockSyncContext.d.ts +11 -11
- package/dist/testing/mocks/MockSyncContext.js +10 -9
- package/dist/testing/mocks/MockSyncStore.js +1 -1
- package/dist/testing/mocks/MockWebSocket.d.ts +2 -2
- 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 +177 -0
- package/dist/transaction/auth/capability.js +199 -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 +49 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +112 -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 +44 -0
- package/dist/transaction/coordination/locator.d.ts +83 -0
- package/dist/transaction/coordination/locator.js +82 -0
- package/dist/transaction/coordination/schema.d.ts +1473 -0
- package/dist/{coordination → transaction/coordination}/schema.js +490 -55
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +103 -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} +11 -11
- package/dist/{errorCodes.js → transaction/errorCodes.js} +35 -12
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- 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 +192 -0
- package/dist/transaction/plugin.js +87 -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 +266 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +319 -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 +85 -0
- package/dist/transaction/resources/where.js +70 -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 +5 -5
- package/dist/{schema → transaction/schema}/field.js +5 -5
- 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 +57 -0
- package/dist/transaction/schema/openapi.js +340 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +14 -14
- 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 +12 -10
- package/dist/{schema → transaction/schema}/schema.js +4 -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 +4 -5
- 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} +10 -36
- 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/{client → transaction/transport}/httpClient.d.ts +59 -16
- package/dist/{client → transaction/transport}/httpClient.js +5 -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 +171 -85
- 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 +576 -0
- package/dist/transaction/transport/wsTransport.js +1017 -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 +63 -45
- 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 +351 -0
- package/dist/transaction/wire/accountResponses.js +255 -0
- package/dist/transaction/wire/auth.d.ts +49 -0
- package/dist/transaction/wire/auth.js +57 -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 +463 -0
- package/dist/transaction/wire/claims.js +229 -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 +177 -0
- package/dist/transaction/wire/feedEvent.js +39 -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 +552 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +50 -0
- package/dist/transaction/wire/index.js +74 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +79 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +110 -59
- 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} +16 -15
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +12 -12
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +11 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +7 -7
- 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} +3 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +4 -3
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- 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 +19 -12
- package/docs/api-keys.md +8 -4
- package/docs/api.md +22 -18
- package/docs/audit.md +2 -0
- package/docs/cli.md +31 -3
- package/docs/client-behavior.md +8 -6
- package/docs/concurrency-convention.md +30 -24
- package/docs/coordination.md +48 -38
- package/docs/data-sources.md +3 -1
- package/docs/debugging.md +5 -3
- 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 +45 -44
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +32 -29
- package/docs/guarantees.md +4 -2
- package/docs/how-it-works.md +9 -7
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +58 -54
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +17 -16
- package/docs/interaction-model.md +6 -4
- package/docs/mcp.md +41 -16
- package/docs/migration.md +63 -5
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +2 -0
- package/docs/quickstart.md +22 -5
- package/docs/react.md +12 -10
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +3 -1
- package/docs/webhooks.md +3 -1
- package/llms.txt +47 -17
- package/package.json +10 -8
- 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/client/durableWrites.d.ts +0 -21
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/transactions/durableWriteStore.js +0 -30
- 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/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/coordination}/claimHeartbeatLoop.d.ts +0 -0
- /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.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/{utils → transaction/utils}/duration.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/duration.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
|
@@ -13,9 +13,10 @@ import { InstanceCache } from '../InstanceCache.js';
|
|
|
13
13
|
import { SyncClient } from '../SyncClient.js';
|
|
14
14
|
import { OnDemandLoader } from '../sync/OnDemandLoader.js';
|
|
15
15
|
import { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
16
|
+
import { loadsAtBootstrap } from '../transaction/schema/loadStrategy.js';
|
|
17
|
+
import { resolveBootstrapBaseUrl } from '../transaction/auth/apiKey.js';
|
|
18
|
+
import { shouldUseInMemoryPersistence } from '../transaction/persistence.js';
|
|
19
|
+
import { resolveDurableWrites } from '../transaction/durableWrites.js';
|
|
19
20
|
export function createInternalComponents(input) {
|
|
20
21
|
const { schema, url, options, auth } = input;
|
|
21
22
|
// The registry is created here, but model registration happens in the caller,
|
|
@@ -72,20 +73,20 @@ export function createInternalComponents(input) {
|
|
|
72
73
|
}
|
|
73
74
|
/**
|
|
74
75
|
* Derives the set of models to fetch in the initial bootstrap request from each
|
|
75
|
-
* model's load strategy. Models declared `load: 'lazy'`
|
|
76
|
-
*
|
|
76
|
+
* model's load strategy. Models declared `load: 'lazy'` are left out of the
|
|
77
|
+
* bootstrap and fetched on demand instead. The default strategy is
|
|
77
78
|
* `'instant'`, which includes the model.
|
|
78
79
|
*/
|
|
79
80
|
function deriveInstantModels(schema) {
|
|
80
81
|
const schemaModels = schema.models ?? schema;
|
|
81
82
|
return Object.entries(schemaModels).flatMap(([key, def]) => {
|
|
82
83
|
if (!def || typeof def !== 'object' || !('load' in def)) {
|
|
83
|
-
return [key]; // no load →
|
|
84
|
+
return [key]; // no load → the default strategy
|
|
84
85
|
}
|
|
85
86
|
const load = def.load;
|
|
86
|
-
if (
|
|
87
|
+
if (loadsAtBootstrap(load)) {
|
|
87
88
|
return [def.typename ?? key];
|
|
88
89
|
}
|
|
89
|
-
return [];
|
|
90
|
+
return [];
|
|
90
91
|
});
|
|
91
92
|
}
|
|
@@ -3,113 +3,44 @@
|
|
|
3
3
|
* `ablo.<model>`.
|
|
4
4
|
*
|
|
5
5
|
* Each schema model gets one {@link ModelOperations}: the async server reads
|
|
6
|
-
* `retrieve` and `list`, the
|
|
7
|
-
*
|
|
6
|
+
* `retrieve` and `list`, the same verbs restricted to the local graph under
|
|
7
|
+
* `local`, the writes `create`, `update`, and `delete`, the coordination
|
|
8
8
|
* namespace `claim` (callable as `claim({ id })`, plus `claim.state`,
|
|
9
9
|
* `claim.queue`, `claim.release`, and `claim.reorder`), `join`, and `onChange`.
|
|
10
10
|
* The factory returns a plain object; the client assembles the `ablo.<model>`
|
|
11
11
|
* lookup table from one of these per model.
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
14
|
-
import { type ModelUpdater, type ContentionOptions } from './functionalUpdate.js';
|
|
15
|
-
import type { MutationOptions } from '../interfaces/index.js';
|
|
16
|
-
import type { StaleNotification } from '../coordination/schema.js';
|
|
13
|
+
import type { ModelTarget } from '../transaction/coordination/schema.js';
|
|
17
14
|
import type { ModelRegistry } from '../ModelRegistry.js';
|
|
18
15
|
import type { InstanceCache } from '../InstanceCache.js';
|
|
19
16
|
import type { SyncClient } from '../SyncClient.js';
|
|
20
17
|
import type { OnDemandLoader } from '../sync/OnDemandLoader.js';
|
|
21
18
|
import type { JoinedParticipant } from '../sync/participants.js';
|
|
22
|
-
import type {
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
import type { Duration, Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease, ClaimWaitOptions, Snapshot } from '../transaction/types/streams.js';
|
|
20
|
+
export type { ModelListScope, ModelTrackParams, ModelTrackResult, LocalReadOptions, LocalCountOptions, ServerReadOptions, ServerRetrieveOptions, ClaimTargetOptions, ClaimParams, ClaimLookupParams, ClaimReorderParams, ClaimOptions, ClaimReadApi, AwaitedClaimMethod, ClaimApi, ModelRetrieveParams, ModelCreateParams, ModelUpdateParams, ModelDeleteParams, JoinOptions, } from '../transaction/resources/modelOperations.js';
|
|
21
|
+
export type { Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease };
|
|
22
|
+
import type { ClaimApi, JoinOptions, LocalCountOptions, LocalReadOptions } from '../transaction/resources/modelOperations.js';
|
|
23
|
+
import type { HttpModelClient } from '../transaction/transport/httpClient.js';
|
|
24
|
+
import type { ParticipantKind } from '../transaction/types/participant.js';
|
|
25
25
|
export interface ModelClientMeta {
|
|
26
26
|
readonly key: string;
|
|
27
27
|
readonly typename: string;
|
|
28
28
|
}
|
|
29
29
|
export declare function getModelClientMeta(modelClient: unknown): ModelClientMeta | undefined;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
* The sync watermark this track is premised on. Omit to baseline at the
|
|
37
|
-
* current head — "tell me about anything from here on". Pass a known
|
|
38
|
-
* `lastSyncId` (e.g. the one you read the row at) to also catch a change that
|
|
39
|
-
* already landed between that read and this call.
|
|
40
|
-
*/
|
|
41
|
-
readAt?: number;
|
|
42
|
-
}
|
|
43
|
-
/** The result of `track({ id })`. */
|
|
44
|
-
export interface ModelTrackResult {
|
|
45
|
-
/**
|
|
46
|
-
* Tracks that had ALREADY fired at registration time — a change matching an
|
|
47
|
-
* open track that landed before this call. Present only when something was
|
|
48
|
-
* already stale; the ongoing signal arrives on the receipts of later commits.
|
|
49
|
-
*/
|
|
50
|
-
notifications?: StaleNotification[];
|
|
51
|
-
}
|
|
52
|
-
/** Options for the synchronous local-pool reads `get`, `getAll`, and
|
|
53
|
-
* `onChange` — a JavaScript `filter`, an equality `where`, and a lifecycle
|
|
54
|
-
* `state`. This is the local, reactive axis; contrast {@link ServerReadOptions},
|
|
55
|
-
* the asynchronous server axis. */
|
|
56
|
-
export interface LocalReadOptions<T> {
|
|
57
|
-
where?: Partial<T>;
|
|
58
|
-
/** Arbitrary local predicate. Applied after `where`. */
|
|
59
|
-
filter?: (entity: T) => boolean;
|
|
60
|
-
orderBy?: {
|
|
61
|
-
[K in keyof T]?: 'asc' | 'desc';
|
|
62
|
-
};
|
|
63
|
-
limit?: number;
|
|
64
|
-
offset?: number;
|
|
65
|
-
/** Lifecycle filter — `live` (the default), `archived`, or `all`. Named
|
|
66
|
-
* `state` so it does not collide with the sync-group `scope`. */
|
|
67
|
-
state?: ModelListScope;
|
|
68
|
-
}
|
|
69
|
-
export type LocalCountOptions<T> = Pick<LocalReadOptions<T>, 'where' | 'filter' | 'state'>;
|
|
70
|
-
/** Options for the asynchronous server reads `retrieve` and `list` — the
|
|
71
|
-
* operator `where` filter, `type`, and `expand`. This is the server axis;
|
|
72
|
-
* contrast {@link LocalReadOptions}, the local, reactive axis. */
|
|
73
|
-
export interface ServerReadOptions<T> {
|
|
74
|
-
/**
|
|
75
|
-
* Filter for the lookup. Accepts two forms:
|
|
76
|
-
* - object form — `{ name: 'foo' }`: equality, where an array value means `IN`
|
|
77
|
-
* - tuple form — `[['name', 'ILIKE', '%Goldman%']]`: explicit operators
|
|
78
|
-
*
|
|
79
|
-
* See {@link LoadWhere} for the full grammar. The wire protocol matches on AND
|
|
80
|
-
* only; for OR semantics, run two `list()` calls and union the results.
|
|
81
|
-
*/
|
|
82
|
-
where?: LoadWhere<T>;
|
|
83
|
-
orderBy?: {
|
|
84
|
-
[K in keyof T]?: 'asc' | 'desc';
|
|
85
|
-
};
|
|
86
|
-
limit?: number;
|
|
87
|
-
/**
|
|
88
|
-
* `complete` waits for the server. `unknown` returns whatever is local
|
|
89
|
-
* immediately and refreshes in the background.
|
|
90
|
-
*/
|
|
91
|
-
type?: 'complete' | 'unknown';
|
|
92
|
-
/**
|
|
93
|
-
* Schema-declared relation names to hydrate alongside the primary
|
|
94
|
-
* rows. The server's compiler resolves each name via the schema's
|
|
95
|
-
* relation metadata (`relation.belongsTo` / `relation.hasMany`)
|
|
96
|
-
* and emits the JOIN.
|
|
97
|
-
*/
|
|
98
|
-
expand?: readonly string[];
|
|
99
|
-
}
|
|
100
|
-
/** Options for the single-row async server read `retrieve({ id })`. A subset of
|
|
101
|
-
* {@link ServerReadOptions} — `where`/`limit`/`orderBy` are fixed by the id. */
|
|
102
|
-
export type ServerRetrieveOptions = Pick<ServerReadOptions<unknown>, 'type' | 'expand'>;
|
|
103
|
-
export interface ModelCollaboration<T> {
|
|
30
|
+
/**
|
|
31
|
+
* The entity a coordination read names, without the sub-entity narrowing —
|
|
32
|
+
* projected from {@link ModelTarget} so the two members are spelled once.
|
|
33
|
+
*/
|
|
34
|
+
type EntityHalf = Pick<ModelTarget, 'model' | 'id'>;
|
|
35
|
+
export interface ModelCollaboration {
|
|
104
36
|
createClaim(options: {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
};
|
|
37
|
+
/**
|
|
38
|
+
* The locator, in the spelling the SDK surface and the HTTP routes use.
|
|
39
|
+
* The canonical {@link ModelTarget} rather than a shape spelled here: this
|
|
40
|
+
* boundary is what a claim's narrowing has to cross, and a member missing
|
|
41
|
+
* from it dies before the socket sees it.
|
|
42
|
+
*/
|
|
43
|
+
target: ModelTarget;
|
|
113
44
|
/** Peer-visible description of the work (`'rewriting the risk section'`). */
|
|
114
45
|
description?: string;
|
|
115
46
|
ttl?: Duration;
|
|
@@ -135,35 +66,23 @@ export interface ModelCollaboration<T> {
|
|
|
135
66
|
* difference is this internal contract takes an explicit `{ model, id }`
|
|
136
67
|
* target because it isn't bound to a single model.
|
|
137
68
|
*/
|
|
138
|
-
state(target:
|
|
139
|
-
model: string;
|
|
140
|
-
id: string;
|
|
141
|
-
}): Claim | null;
|
|
69
|
+
state(target: EntityHalf): Claim | null;
|
|
142
70
|
/**
|
|
143
71
|
* The reactive wait queue on a target — the FIFO line of queued claims
|
|
144
72
|
* behind the holder. Synchronous snapshot off the synced claim stream.
|
|
145
73
|
*/
|
|
146
|
-
queue(target:
|
|
147
|
-
model: string;
|
|
148
|
-
id: string;
|
|
149
|
-
}): readonly Claim[];
|
|
74
|
+
queue(target: EntityHalf): readonly Claim[];
|
|
150
75
|
/**
|
|
151
76
|
* Re-rank the wait queue on a target (privileged — server-gated). `order` is
|
|
152
77
|
* the desired front-of-line ordering, taken from `queue(target)`.
|
|
153
78
|
*/
|
|
154
|
-
reorder(target:
|
|
155
|
-
model: string;
|
|
156
|
-
id: string;
|
|
157
|
-
}, order: readonly Claim[]): void;
|
|
79
|
+
reorder(target: EntityHalf, order: readonly Claim[]): void;
|
|
158
80
|
/**
|
|
159
81
|
* Resolve once no participant holds an active claim on the target.
|
|
160
82
|
* The contender's "wait until it's free" — delegates to the claim
|
|
161
83
|
* stream's `waitFor`.
|
|
162
84
|
*/
|
|
163
|
-
waitFor(target:
|
|
164
|
-
model: string;
|
|
165
|
-
id: string;
|
|
166
|
-
}, options?: ClaimWaitOptions): Promise<void>;
|
|
85
|
+
waitFor(target: EntityHalf, options?: ClaimWaitOptions): Promise<void>;
|
|
167
86
|
/**
|
|
168
87
|
* The local participant's id. Used to distinguish "I already hold this"
|
|
169
88
|
* from "someone else holds it" in `claimOrWait`.
|
|
@@ -175,7 +94,7 @@ export interface ModelCollaboration<T> {
|
|
|
175
94
|
* holds the lease: server presence frames exclude a holder's own claims, so
|
|
176
95
|
* the holder builds its own view.
|
|
177
96
|
*/
|
|
178
|
-
readonly selfParticipantKind?:
|
|
97
|
+
readonly selfParticipantKind?: ParticipantKind;
|
|
179
98
|
/**
|
|
180
99
|
* Subscribes the connection to a scope's sync group(s) — read interest. The
|
|
181
100
|
* typed surface calls this on single-entity reads and claim observation so a
|
|
@@ -200,261 +119,51 @@ export interface ModelCollaboration<T> {
|
|
|
200
119
|
*/
|
|
201
120
|
createJoin?(modelKey: string, ids: string | readonly string[], options?: JoinOptions): Promise<JoinedParticipant>;
|
|
202
121
|
}
|
|
203
|
-
export interface ClaimTargetOptions<T = Record<string, unknown>> {
|
|
204
|
-
/** Peer-visible description of the work being performed — the sentence a
|
|
205
|
-
* contending participant reads to decide whether to wait, work elsewhere, or
|
|
206
|
-
* move on. Defaults to `'editing'`. The same field on every claim surface. */
|
|
207
|
-
description?: string;
|
|
208
|
-
/** Field-level target, for fine-grained claimed-state badges. */
|
|
209
|
-
field?: string;
|
|
210
|
-
/** Optional path for document/file-like targets. */
|
|
211
|
-
path?: string;
|
|
212
|
-
/** Optional range for document/file-like targets. */
|
|
213
|
-
range?: TargetRange;
|
|
214
|
-
/** App-defined structured metadata. */
|
|
215
|
-
meta?: Record<string, unknown>;
|
|
216
|
-
/** Crash-cleanup TTL — the claim auto-releases if the holder dies. */
|
|
217
|
-
ttl?: Duration;
|
|
218
|
-
/**
|
|
219
|
-
* Behavior under contention. `true` (the default) queues behind the current
|
|
220
|
-
* holder and resolves once the row is yours. `false` is fail-fast: if another
|
|
221
|
-
* participant already holds the row, it rejects immediately with
|
|
222
|
-
* {@link AbloClaimedError} instead of waiting. Use `false` to deduplicate
|
|
223
|
-
* distributed work ("if someone else has this job, skip it"), where waiting
|
|
224
|
-
* would mean double-processing.
|
|
225
|
-
*
|
|
226
|
-
* The high-level typed claim defaults this on because it serializes writers;
|
|
227
|
-
* the low-level lease and the HTTP client default it off, since they resolve
|
|
228
|
-
* immediately and cannot transparently wait for a grant.
|
|
229
|
-
*/
|
|
230
|
-
queue?: boolean;
|
|
231
|
-
/**
|
|
232
|
-
* Backpressure: queue, but not behind too many others. If the server reports a
|
|
233
|
-
* position at or beyond `maxQueueDepth` when the client joins the line, it
|
|
234
|
-
* rejects with {@link AbloClaimedError} (`queue_too_deep`) instead of waiting.
|
|
235
|
-
* Omit to wait however deep the queue is.
|
|
236
|
-
*/
|
|
237
|
-
maxQueueDepth?: number;
|
|
238
|
-
/**
|
|
239
|
-
* Keep the lease alive for the duration of real work by beating on a
|
|
240
|
-
* cadence — the pattern for background workers whose task outlives the
|
|
241
|
-
* crash-cleanup TTL. `true` beats every third of the TTL (so two beats can
|
|
242
|
-
* fail before the lease is at risk, and a crashed worker's lease still
|
|
243
|
-
* lapses within one beat window); a duration such as `'2m'` sets the
|
|
244
|
-
* cadence explicitly. The loop stops on release. A beat answered with a
|
|
245
|
-
* definitive loss stops the loop and calls {@link onHeartbeatLost}; you can
|
|
246
|
-
* also beat manually with `held.heartbeat()`.
|
|
247
|
-
*/
|
|
248
|
-
heartbeat?: true | Duration;
|
|
249
|
-
/**
|
|
250
|
-
* Called once if the auto-heartbeat learns the lease is no longer yours
|
|
251
|
-
* (expired and possibly granted onward). The loop has already stopped;
|
|
252
|
-
* abandon the work or re-claim. Any write attempted under the old lease is
|
|
253
|
-
* independently rejected by its `readAt` guard.
|
|
254
|
-
*/
|
|
255
|
-
onHeartbeatLost?: (error: AbloClaimedError) => void;
|
|
256
|
-
/**
|
|
257
|
-
* Called after every successful beat (manual or auto) with the server's
|
|
258
|
-
* answer — chiefly `queueDepth`, the number of participants waiting in
|
|
259
|
-
* line behind this lease. A worker that can checkpoint may read pressure
|
|
260
|
-
* here and release early when others wait.
|
|
261
|
-
*/
|
|
262
|
-
onHeartbeat?(beat: ClaimHeartbeat): void;
|
|
263
|
-
}
|
|
264
|
-
/** Options for `claim({ id, ... })`. */
|
|
265
|
-
export interface ClaimParams<T = Record<string, unknown>> extends ClaimTargetOptions<T> {
|
|
266
|
-
readonly id: string;
|
|
267
|
-
}
|
|
268
|
-
export interface ClaimLookupParams<T = Record<string, unknown>> {
|
|
269
|
-
readonly id: string;
|
|
270
|
-
readonly field?: string;
|
|
271
|
-
}
|
|
272
|
-
export interface ClaimReorderParams<T = Record<string, unknown>> extends ClaimLookupParams<T> {
|
|
273
|
-
readonly order: readonly Claim[];
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* A claim handle: the held entity data plus an explicit release hook.
|
|
277
|
-
*
|
|
278
|
-
* ```ts
|
|
279
|
-
* const claim = await ablo.weatherReports.claim({
|
|
280
|
-
* id: 'report_stockholm',
|
|
281
|
-
* description: 'Fetching current weather before writing the forecast.',
|
|
282
|
-
* });
|
|
283
|
-
* try {
|
|
284
|
-
* await ablo.weatherReports.update({
|
|
285
|
-
* id: claim.target.id,
|
|
286
|
-
* data: { status: 'ready' },
|
|
287
|
-
* claim,
|
|
288
|
-
* });
|
|
289
|
-
* } finally {
|
|
290
|
-
* await claim.release();
|
|
291
|
-
* }
|
|
292
|
-
* ```
|
|
293
|
-
*
|
|
294
|
-
* `data` is a snapshot taken after the lease is held. Write through the flat
|
|
295
|
-
* `ablo.<model>.update({ id, data, claim })` verb — the handle carries the
|
|
296
|
-
* lease id and snapshot watermark for attribution and stale-write protection.
|
|
297
|
-
*/
|
|
298
|
-
export type { Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease };
|
|
299
|
-
export type ClaimOptions<T = Record<string, unknown>> = ClaimTargetOptions<T>;
|
|
300
122
|
/**
|
|
301
|
-
* The
|
|
302
|
-
*
|
|
303
|
-
* Most callers do not need this namespace directly. Put `claim: { ... }` on a
|
|
304
|
-
* write and the SDK acquires/releases around that one mutation:
|
|
123
|
+
* The synchronous, local-only reads — reached as `ablo.<model>.local.*`.
|
|
305
124
|
*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
* description: 'Renaming the task to match the project brief.',
|
|
313
|
-
* },
|
|
314
|
-
* });
|
|
315
|
-
* ```
|
|
125
|
+
* Every verb mirrors its asynchronous sibling on the base surface, and the one
|
|
126
|
+
* word in front is the whole difference. It is a narrowing, not a claim about
|
|
127
|
+
* the other side: `retrieve` consults the local graph and then the network,
|
|
128
|
+
* while `local.retrieve` is restricted to what is already resident — which is
|
|
129
|
+
* also why it can return a value instead of a promise. There is nothing to
|
|
130
|
+
* await.
|
|
316
131
|
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
* controls for UI and operators.
|
|
132
|
+
* These reads exist only here. Exposing them at the top level too would undo
|
|
133
|
+
* the distinction the namespace draws.
|
|
320
134
|
*/
|
|
321
|
-
|
|
322
|
-
* The coordination reads and scheduler controls on a claim namespace, in their
|
|
323
|
-
* reactive (synchronous) form: `state`, `queue`, and `reorder` resolve against
|
|
324
|
-
* the local pool with no round-trip, which is what lets a reactive selector read
|
|
325
|
-
* coordination state inside a React render.
|
|
326
|
-
*
|
|
327
|
-
* This is the single source of truth for the claim read surface. The stateless
|
|
328
|
-
* HTTP client exposes the awaited projection of exactly these methods (derived
|
|
329
|
-
* via {@link AwaitedClaimMethod}), so the two transports cannot drift — change a
|
|
330
|
-
* signature here and the HTTP surface follows.
|
|
331
|
-
*/
|
|
332
|
-
export interface ClaimReadApi<T = Record<string, unknown>> {
|
|
135
|
+
export interface LocalReads<T> {
|
|
333
136
|
/**
|
|
334
|
-
*
|
|
335
|
-
*
|
|
137
|
+
* Snapshot of a single row from the local graph. `undefined` when the row is
|
|
138
|
+
* not resident — a graph that is still empty, or a `lazy` model not yet
|
|
139
|
+
* loaded. Pairs with reactive selectors:
|
|
140
|
+
* `useAblo((ablo) => ablo.<model>.local.retrieve(id))`.
|
|
336
141
|
*/
|
|
337
|
-
|
|
142
|
+
retrieve(id: string): T | undefined;
|
|
338
143
|
/**
|
|
339
|
-
*
|
|
340
|
-
*
|
|
144
|
+
* Snapshot of a filtered collection from the local graph. Empty until
|
|
145
|
+
* `retrieve`, `list`, or bootstrap has warmed the graph.
|
|
341
146
|
*/
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
};
|
|
346
|
-
/**
|
|
347
|
-
* Re-rank the wait line. Advanced and permission-gated.
|
|
348
|
-
*/
|
|
349
|
-
reorder(params: ClaimReorderParams<T>): void;
|
|
350
|
-
/** Release a manual claim handle early. Single-write claims auto-release. */
|
|
351
|
-
release(params: ClaimLookupParams<T> | Claim<T>): Promise<void>;
|
|
147
|
+
list(options?: LocalReadOptions<T>): T[];
|
|
148
|
+
/** Count rows in the local graph. */
|
|
149
|
+
count(options?: LocalCountOptions<T>): number;
|
|
352
150
|
}
|
|
353
151
|
/**
|
|
354
|
-
*
|
|
355
|
-
*
|
|
356
|
-
*
|
|
152
|
+
* What a reactive client adds on top of the base per-model surface: a live
|
|
153
|
+
* graph to read (`local`), the synchronous projection of the claim reads, and
|
|
154
|
+
* the two subscriptions a persistent socket makes possible.
|
|
155
|
+
*
|
|
156
|
+
* `claim` is here rather than inherited because the two transports carry
|
|
157
|
+
* deliberately different claim types, and the difference is load-bearing: a
|
|
158
|
+
* stateless client has no local copy, so `state`/`queue`/`reorder` must be
|
|
159
|
+
* awaited, while a reactive client resolves them synchronously — which is
|
|
160
|
+
* precisely what lets a React render read claim state inline. The stateless
|
|
161
|
+
* form is *derived* from this one through {@link AwaitedClaimMethod}, so the
|
|
162
|
+
* only permitted difference between them is that promise wrapper.
|
|
357
163
|
*/
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
* Takes a claim and returns an explicit held-work handle — a {@link HeldClaim}.
|
|
362
|
-
* `data`, `release`, `revoke`, and the async disposer are always present (this
|
|
363
|
-
* call re-reads the row under the lease), so callers can use `handle.data`
|
|
364
|
-
* directly and `await using` works without a guard.
|
|
365
|
-
*/
|
|
366
|
-
(params: ClaimParams<T>): Promise<HeldClaim<T>>;
|
|
367
|
-
/**
|
|
368
|
-
* Takes a claim by id alone, for a row that lives only in the customer's own
|
|
369
|
-
* database — Ablo has never seen it, so there is nothing to re-read. Returns a
|
|
370
|
-
* {@link HeldLease}: the same lease controls as {@link HeldClaim}
|
|
371
|
-
* (`release`, `revoke`, `heartbeat`, `await using`) but no `.data`. Locking a
|
|
372
|
-
* key you know by id is exactly this — serialize writers without first
|
|
373
|
-
* syncing the row into Ablo.
|
|
374
|
-
*/
|
|
375
|
-
(id: string, opts?: ClaimOptions<T>): Promise<HeldLease>;
|
|
376
|
-
}
|
|
377
|
-
export interface ModelRetrieveParams extends ServerRetrieveOptions {
|
|
378
|
-
readonly id: string;
|
|
379
|
-
}
|
|
380
|
-
export interface ModelCreateParams<T, CreateInput> extends MutationOptions {
|
|
381
|
-
readonly data: CreateInput;
|
|
382
|
-
readonly id?: string | null;
|
|
383
|
-
readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
|
|
384
|
-
}
|
|
385
|
-
export interface ModelUpdateParams<T> extends MutationOptions {
|
|
386
|
-
readonly id: string;
|
|
387
|
-
readonly data: Partial<T>;
|
|
388
|
-
readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
|
|
389
|
-
}
|
|
390
|
-
export interface ModelDeleteParams<T> extends MutationOptions {
|
|
391
|
-
readonly id: string;
|
|
392
|
-
readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
|
|
393
|
-
}
|
|
394
|
-
/** Options for the WebSocket-only `ablo.<model>.join(ids, options?)`. */
|
|
395
|
-
export interface JoinOptions {
|
|
396
|
-
/**
|
|
397
|
-
* Lease TTL for the underlying presence claim — the participant
|
|
398
|
-
* auto-releases after this if the holder dies. Compact duration string
|
|
399
|
-
* (`'5m'`) or ms number, mirroring the claim `ttl`.
|
|
400
|
-
*/
|
|
401
|
-
ttl?: Duration;
|
|
402
|
-
}
|
|
403
|
-
export interface ModelOperations<T, CreateInput> {
|
|
404
|
-
/**
|
|
405
|
-
* Reads a single entity by id from the server; asynchronous. Resolves through
|
|
406
|
-
* a three-tier lookup — local pool, then IndexedDB, then a network
|
|
407
|
-
* `POST /sync/query` — and lands the row in the local graph. Resolves to
|
|
408
|
-
* `undefined` when no such row exists.
|
|
409
|
-
*
|
|
410
|
-
* This is the default "get me this entity" read, and the one a stateless
|
|
411
|
-
* client wants, since its local graph starts empty. For a synchronous read of
|
|
412
|
-
* an already-warm graph (such as a React selector) use `get(id)`.
|
|
413
|
-
*/
|
|
414
|
-
retrieve(params: ModelRetrieveParams): Promise<T | undefined>;
|
|
415
|
-
/**
|
|
416
|
-
* Lists entities matching a filter from the server; asynchronous. Uses the
|
|
417
|
-
* same three-tier lookup and graph hydration as `retrieve`, deduplicated so
|
|
418
|
-
* concurrent identical calls share one request. Returns the matched rows. For
|
|
419
|
-
* a synchronous read of the local graph use `getAll(...)`.
|
|
420
|
-
*/
|
|
421
|
-
list(options?: ServerReadOptions<T>): Promise<T[]>;
|
|
422
|
-
/**
|
|
423
|
-
* Synchronous snapshot of a single entity from the local graph; no network.
|
|
424
|
-
* Returns `undefined` when the row is not resident (a client whose graph is
|
|
425
|
-
* still empty, or a `lazy` model not yet loaded). Pairs with reactive
|
|
426
|
-
* selectors: `useAblo((ablo) => ablo.<model>.get(id))`.
|
|
427
|
-
*/
|
|
428
|
-
get(id: string): T | undefined;
|
|
429
|
-
/**
|
|
430
|
-
* Synchronous snapshot of a filtered collection from the local graph; no
|
|
431
|
-
* network round-trip. Empty until `retrieve`, `list`, or bootstrap has warmed
|
|
432
|
-
* the graph.
|
|
433
|
-
*/
|
|
434
|
-
getAll(options?: LocalReadOptions<T>): T[];
|
|
435
|
-
/** Count entities in the local graph; synchronous, no network. */
|
|
436
|
-
getCount(options?: LocalCountOptions<T>): number;
|
|
437
|
-
/**
|
|
438
|
-
* Create a new entity — **optimistic, offline-first**. Resolves once
|
|
439
|
-
* the mutation is queued locally, not when the server confirms.
|
|
440
|
-
* Server rejection rolls back automatically; watch `sync.syncStatus`.
|
|
441
|
-
*/
|
|
442
|
-
create(params: ModelCreateParams<T, CreateInput>): Promise<T>;
|
|
443
|
-
/** Update an entity by id — optimistic, offline-first (see `create`). */
|
|
444
|
-
update(params: ModelUpdateParams<T>): Promise<T>;
|
|
445
|
-
/**
|
|
446
|
-
* Updates under contention with a function of the latest state —
|
|
447
|
-
* `update(id, current => next)`. The client reads the freshest row, runs your
|
|
448
|
-
* updater, writes the result as a compare-and-swap, and re-reads and re-runs
|
|
449
|
-
* on any concurrent write. Nothing about claims, identity, or conflict codes
|
|
450
|
-
* surfaces: the write either lands or throws {@link AbloContentionError} once
|
|
451
|
-
* its reconcile budget is spent. Return `null` or `undefined` from the updater
|
|
452
|
-
* to skip the write. Resolves to the reconciled row, or `undefined` when the
|
|
453
|
-
* updater opted out.
|
|
454
|
-
*/
|
|
455
|
-
update(id: string, updater: ModelUpdater<T>, options?: ContentionOptions): Promise<T | undefined>;
|
|
456
|
-
/** Delete an entity by id — optimistic, offline-first (see `create`). */
|
|
457
|
-
delete(params: ModelDeleteParams<T>): Promise<void>;
|
|
164
|
+
interface ReactiveModelSurface<T> {
|
|
165
|
+
/** The synchronous local-graph reads. */
|
|
166
|
+
local: LocalReads<T>;
|
|
458
167
|
/**
|
|
459
168
|
* Claim a row so other writers wait or are rejected until you're done, and
|
|
460
169
|
* inspect or manage that coordination through the same namespace. Call it to
|
|
@@ -482,25 +191,6 @@ export interface ModelOperations<T, CreateInput> {
|
|
|
482
191
|
* ```
|
|
483
192
|
*/
|
|
484
193
|
claim: ClaimApi<T>;
|
|
485
|
-
/**
|
|
486
|
-
* Register a durable read-dependency on a row of this model — keep hearing
|
|
487
|
-
* about it after this call returns. Where the per-write `reads` gate lives for
|
|
488
|
-
* exactly one commit, a track persists on the server: any change that lands on
|
|
489
|
-
* the tracked row rides back on the `notifications` of your next commit, so a
|
|
490
|
-
* long-running actor learns its context went stale without re-reading. A track
|
|
491
|
-
* you already have is refreshed, not duplicated (it is an idempotent upsert).
|
|
492
|
-
*
|
|
493
|
-
* ```ts
|
|
494
|
-
* await ablo.tasks.track({ id: 'task_42' });
|
|
495
|
-
* // …minutes of other work later, on your next write…
|
|
496
|
-
* const res = await ablo.tasks.update({ id: 'task_42', data: { done: true } });
|
|
497
|
-
* res.notifications; // populated if task_42 changed under you in the meantime
|
|
498
|
-
* ```
|
|
499
|
-
*
|
|
500
|
-
* The returned `notifications` are only the tracks that had ALREADY fired at
|
|
501
|
-
* registration time; the ongoing signal arrives on later receipts.
|
|
502
|
-
*/
|
|
503
|
-
track(params: ModelTrackParams): Promise<ModelTrackResult>;
|
|
504
194
|
/**
|
|
505
195
|
* Joins the sync group(s) for one or more rows of this model and returns a
|
|
506
196
|
* live participant handle — presence (`.peers`), the scoped claim stream
|
|
@@ -512,7 +202,7 @@ export interface ModelOperations<T, CreateInput> {
|
|
|
512
202
|
* clients and throws on any non-WebSocket construction.
|
|
513
203
|
*
|
|
514
204
|
* ```ts
|
|
515
|
-
* await using participant = await ablo.
|
|
205
|
+
* await using participant = await ablo.sections.join(sectionIds, { ttl: '5m' });
|
|
516
206
|
* participant.peers; // who else is here
|
|
517
207
|
* ```
|
|
518
208
|
*/
|
|
@@ -520,4 +210,19 @@ export interface ModelOperations<T, CreateInput> {
|
|
|
520
210
|
/** Subscribe to changes; the callback runs on every change. */
|
|
521
211
|
onChange(callback: (entities: T[]) => void, options?: LocalReadOptions<T>): () => void;
|
|
522
212
|
}
|
|
523
|
-
|
|
213
|
+
/**
|
|
214
|
+
* Everything reachable as `ablo.<model>` on a reactive client.
|
|
215
|
+
*
|
|
216
|
+
* The base is not written here — it is the transport-independent per-model
|
|
217
|
+
* surface, taken whole. A reactive client is that surface plus what a live
|
|
218
|
+
* graph makes possible, so this type states the relationship instead of
|
|
219
|
+
* restating the members, and a verb added to the base arrives here on its own.
|
|
220
|
+
*
|
|
221
|
+
* `claim` is the one member the base cannot supply directly: the two forms
|
|
222
|
+
* differ by an awaitedness transform, so it is replaced rather than inherited.
|
|
223
|
+
* See {@link ReactiveModelSurface}.
|
|
224
|
+
*/
|
|
225
|
+
export type ModelOperations<T, CreateInput> = Omit<HttpModelClient<T, CreateInput>, 'claim'> & ReactiveModelSurface<T>;
|
|
226
|
+
export declare function createModelProxy<T, C>(schemaKey: string, registeredModelName: string, objectPool: InstanceCache, syncClient: SyncClient, registry: ModelRegistry, hydration: OnDemandLoader, collaboration?: ModelCollaboration,
|
|
227
|
+
/** The client-wide `wait` default; a per-call `wait` still wins over it. */
|
|
228
|
+
defaultWait?: 'queued' | 'confirmed'): ModelOperations<T, C>;
|