@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
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The request contract for `ablo.<model>` — the option and parameter shapes a
|
|
3
|
+
* caller passes to a read, a write, or a claim.
|
|
4
|
+
*
|
|
5
|
+
* These types describe the *change or the query being requested*, never a local
|
|
6
|
+
* copy of the rows it touches, so they sit in the settlement core and are shared
|
|
7
|
+
* by every transport and every caller (ADR 0013 §4, ADR 0016). The factory that
|
|
8
|
+
* binds them to reactive model instances — `createModelProxy` — stays with the
|
|
9
|
+
* reactive consumer, along with `ModelOperations` and `ModelCollaboration`,
|
|
10
|
+
* which reference the live participant handle.
|
|
11
|
+
*/
|
|
12
|
+
import type { ModelScope } from '../types/index.js';
|
|
13
|
+
import type { ResolveClaimMeta } from '../types/global.js';
|
|
14
|
+
import type { AbloClaimedError } from '../errors.js';
|
|
15
|
+
import type { StaleNotification, TrackDependency } from '../coordination/schema.js';
|
|
16
|
+
import type { Duration } from '../utils/duration.js';
|
|
17
|
+
import type { Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease, TargetRange } from '../types/streams.js';
|
|
18
|
+
import type { MutationOptions } from './mutationOptions.js';
|
|
19
|
+
import type { LoadWhere } from './where.js';
|
|
20
|
+
/**
|
|
21
|
+
* A lifecycle filter, accepted either as the enum or as its bare string. The
|
|
22
|
+
* string arm is a template projection of the enum rather than a second list, so
|
|
23
|
+
* a scope added to {@link ModelScope} is spellable both ways at once.
|
|
24
|
+
*/
|
|
25
|
+
export type ModelListScope = ModelScope | `${ModelScope}`;
|
|
26
|
+
/**
|
|
27
|
+
* Options for `track({ id })` — register a durable premise on a row.
|
|
28
|
+
*
|
|
29
|
+
* Derived from the wire's row-form {@link TrackDependency} rather than restated
|
|
30
|
+
* beside it: the caller names the row and, optionally, the watermark it is
|
|
31
|
+
* premised on, while `model` comes from the proxy the call was made on. Adding
|
|
32
|
+
* a field to the dependency therefore reaches this surface automatically, and
|
|
33
|
+
* removing one stops the callers compiling.
|
|
34
|
+
*
|
|
35
|
+
* On `readAt`: omit it to baseline at the current head — "tell me about
|
|
36
|
+
* anything from here on". Pass a known watermark (the one you read the row at)
|
|
37
|
+
* to also catch a change that landed between that read and this call.
|
|
38
|
+
*/
|
|
39
|
+
export type ModelTrackParams = Omit<Extract<TrackDependency, {
|
|
40
|
+
model: string;
|
|
41
|
+
}>, 'model'>;
|
|
42
|
+
/** The result of `track({ id })`. */
|
|
43
|
+
export interface ModelTrackResult {
|
|
44
|
+
/**
|
|
45
|
+
* Tracks that had ALREADY fired at registration time — a change matching an
|
|
46
|
+
* open track that landed before this call. Present only when something was
|
|
47
|
+
* already stale; the ongoing signal arrives on the receipts of later commits.
|
|
48
|
+
*/
|
|
49
|
+
notifications?: StaleNotification[];
|
|
50
|
+
}
|
|
51
|
+
/** Options for the synchronous local-graph reads `local.list` and `onChange` —
|
|
52
|
+
* a JavaScript `filter`, an equality `where`, and a lifecycle `state`. This is
|
|
53
|
+
* the local, reactive axis; contrast {@link ServerReadOptions}, the
|
|
54
|
+
* asynchronous server axis. */
|
|
55
|
+
export interface LocalReadOptions<T> {
|
|
56
|
+
where?: Partial<T>;
|
|
57
|
+
/** Arbitrary local predicate. Applied after `where`. */
|
|
58
|
+
filter?: (entity: T) => boolean;
|
|
59
|
+
orderBy?: {
|
|
60
|
+
[K in keyof T]?: 'asc' | 'desc';
|
|
61
|
+
};
|
|
62
|
+
limit?: number;
|
|
63
|
+
offset?: number;
|
|
64
|
+
/** Lifecycle filter — `live` (the default), `archived`, or `all`. Named
|
|
65
|
+
* `state` so it does not collide with the sync-group `scope`. */
|
|
66
|
+
state?: ModelListScope;
|
|
67
|
+
}
|
|
68
|
+
export type LocalCountOptions<T> = Pick<LocalReadOptions<T>, 'where' | 'filter' | 'state'>;
|
|
69
|
+
/** Options for the asynchronous server reads `retrieve` and `list` — the
|
|
70
|
+
* operator `where` filter, `type`, and `expand`. This is the server axis;
|
|
71
|
+
* contrast {@link LocalReadOptions}, the local, reactive axis. */
|
|
72
|
+
export interface ServerReadOptions<T> {
|
|
73
|
+
/**
|
|
74
|
+
* Filter for the lookup. Accepts two forms:
|
|
75
|
+
* - object form — `{ name: 'foo' }`: equality, where an array value means `IN`
|
|
76
|
+
* - tuple form — `[['name', 'ILIKE', '%Goldman%']]`: explicit operators
|
|
77
|
+
*
|
|
78
|
+
* See {@link LoadWhere} for the full grammar. The wire protocol matches on AND
|
|
79
|
+
* only; for OR semantics, run two `list()` calls and union the results.
|
|
80
|
+
*/
|
|
81
|
+
where?: LoadWhere<T>;
|
|
82
|
+
orderBy?: {
|
|
83
|
+
[K in keyof T]?: 'asc' | 'desc';
|
|
84
|
+
};
|
|
85
|
+
limit?: number;
|
|
86
|
+
/**
|
|
87
|
+
* `complete` waits for the server. `unknown` returns whatever is local
|
|
88
|
+
* immediately and refreshes in the background.
|
|
89
|
+
*/
|
|
90
|
+
type?: 'complete' | 'unknown';
|
|
91
|
+
/**
|
|
92
|
+
* Schema-declared relation names to hydrate alongside the primary
|
|
93
|
+
* rows. The server's compiler resolves each name via the schema's
|
|
94
|
+
* relation metadata (`relation.belongsTo` / `relation.hasMany`)
|
|
95
|
+
* and emits the JOIN.
|
|
96
|
+
*/
|
|
97
|
+
expand?: readonly string[];
|
|
98
|
+
}
|
|
99
|
+
/** Options for the single-row async server read `retrieve({ id })`. A subset of
|
|
100
|
+
* {@link ServerReadOptions} — `where`/`limit`/`orderBy` are fixed by the id. */
|
|
101
|
+
export type ServerRetrieveOptions = Pick<ServerReadOptions<unknown>, 'type' | 'expand'>;
|
|
102
|
+
export interface ClaimTargetOptions<T = Record<string, unknown>> {
|
|
103
|
+
/** Peer-visible description of the work being performed — the sentence a
|
|
104
|
+
* contending participant reads to decide whether to wait, work elsewhere, or
|
|
105
|
+
* move on. Defaults to `'editing'`. The same field on every claim surface. */
|
|
106
|
+
description?: string;
|
|
107
|
+
/** Field-level target, for fine-grained claimed-state badges. */
|
|
108
|
+
field?: string;
|
|
109
|
+
/**
|
|
110
|
+
* Several named parts of the row at once. Claims conflict where their sets
|
|
111
|
+
* intersect, so two holders on disjoint parts do not wait for each other.
|
|
112
|
+
* Prefer this to packing names into `field`, which compares as one opaque
|
|
113
|
+
* string and lets overlapping sets both be granted.
|
|
114
|
+
*/
|
|
115
|
+
fields?: readonly string[];
|
|
116
|
+
/** Optional path for document/file-like targets. */
|
|
117
|
+
path?: string;
|
|
118
|
+
/** Optional range for document/file-like targets. */
|
|
119
|
+
range?: TargetRange;
|
|
120
|
+
/**
|
|
121
|
+
* App-defined structured metadata, carried verbatim to every participant
|
|
122
|
+
* that observes the claim. Declare its shape once, on `Register`'s
|
|
123
|
+
* `ClaimMeta` slot, and what you write here is what every reader is typed to
|
|
124
|
+
* find — the write side and the read side are the same declaration.
|
|
125
|
+
*/
|
|
126
|
+
meta?: ResolveClaimMeta;
|
|
127
|
+
/** Crash-cleanup TTL — the claim auto-releases if the holder dies. */
|
|
128
|
+
ttl?: Duration;
|
|
129
|
+
/**
|
|
130
|
+
* Behavior under contention. `true` (the default) queues behind the current
|
|
131
|
+
* holder and resolves once the row is yours. `false` is fail-fast: if another
|
|
132
|
+
* participant already holds the row, it rejects immediately with
|
|
133
|
+
* {@link AbloClaimedError} instead of waiting. Use `false` to deduplicate
|
|
134
|
+
* distributed work ("if someone else has this job, skip it"), where waiting
|
|
135
|
+
* would mean double-processing.
|
|
136
|
+
*
|
|
137
|
+
* The high-level typed claim defaults this on because it serializes writers;
|
|
138
|
+
* the low-level lease and the HTTP client default it off, since they resolve
|
|
139
|
+
* immediately and cannot transparently wait for a grant.
|
|
140
|
+
*/
|
|
141
|
+
queue?: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Backpressure: queue, but not behind too many others. If the server reports a
|
|
144
|
+
* position at or beyond `maxQueueDepth` when the client joins the line, it
|
|
145
|
+
* rejects with {@link AbloClaimedError} (`queue_too_deep`) instead of waiting.
|
|
146
|
+
* Omit to wait however deep the queue is.
|
|
147
|
+
*/
|
|
148
|
+
maxQueueDepth?: number;
|
|
149
|
+
/**
|
|
150
|
+
* Keep the lease alive for the duration of real work by beating on a
|
|
151
|
+
* cadence — the pattern for background workers whose task outlives the
|
|
152
|
+
* crash-cleanup TTL. `true` beats every third of the TTL (so two beats can
|
|
153
|
+
* fail before the lease is at risk, and a crashed worker's lease still
|
|
154
|
+
* lapses within one beat window); a duration such as `'2m'` sets the
|
|
155
|
+
* cadence explicitly. The loop stops on release. A beat answered with a
|
|
156
|
+
* definitive loss stops the loop and calls {@link onHeartbeatLost}; you can
|
|
157
|
+
* also beat manually with `held.heartbeat()`.
|
|
158
|
+
*/
|
|
159
|
+
heartbeat?: true | Duration;
|
|
160
|
+
/**
|
|
161
|
+
* Called once if the auto-heartbeat learns the lease is no longer yours
|
|
162
|
+
* (expired and possibly granted onward). The loop has already stopped;
|
|
163
|
+
* abandon the work or re-claim. Any write attempted under the old lease is
|
|
164
|
+
* independently rejected by its `readAt` guard.
|
|
165
|
+
*/
|
|
166
|
+
onHeartbeatLost?: (error: AbloClaimedError) => void;
|
|
167
|
+
/**
|
|
168
|
+
* Called after every successful beat (manual or auto) with the server's
|
|
169
|
+
* answer — chiefly `queueDepth`, the number of participants waiting in
|
|
170
|
+
* line behind this lease. A worker that can checkpoint may read pressure
|
|
171
|
+
* here and release early when others wait.
|
|
172
|
+
*/
|
|
173
|
+
onHeartbeat?(beat: ClaimHeartbeat): void;
|
|
174
|
+
}
|
|
175
|
+
/** Options for `claim({ id, ... })`. */
|
|
176
|
+
export interface ClaimParams<T = Record<string, unknown>> extends ClaimTargetOptions<T> {
|
|
177
|
+
readonly id: string;
|
|
178
|
+
}
|
|
179
|
+
export interface ClaimLookupParams<T = Record<string, unknown>> {
|
|
180
|
+
readonly id: string;
|
|
181
|
+
readonly field?: string;
|
|
182
|
+
}
|
|
183
|
+
export interface ClaimReorderParams<T = Record<string, unknown>> extends ClaimLookupParams<T> {
|
|
184
|
+
readonly order: readonly Claim[];
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* A claim handle: the held entity data plus an explicit release hook.
|
|
188
|
+
*
|
|
189
|
+
* ```ts
|
|
190
|
+
* const claim = await ablo.weatherReports.claim({
|
|
191
|
+
* id: 'report_stockholm',
|
|
192
|
+
* description: 'Fetching current weather before writing the forecast.',
|
|
193
|
+
* });
|
|
194
|
+
* try {
|
|
195
|
+
* await ablo.weatherReports.update({
|
|
196
|
+
* id: claim.target.id,
|
|
197
|
+
* data: { status: 'ready' },
|
|
198
|
+
* claim,
|
|
199
|
+
* });
|
|
200
|
+
* } finally {
|
|
201
|
+
* await claim.release();
|
|
202
|
+
* }
|
|
203
|
+
* ```
|
|
204
|
+
*
|
|
205
|
+
* `data` is a snapshot taken after the lease is held. Write through the flat
|
|
206
|
+
* `ablo.<model>.update({ id, data, claim })` verb — the handle carries the
|
|
207
|
+
* lease id and snapshot watermark for attribution and stale-write protection.
|
|
208
|
+
*/
|
|
209
|
+
export type { Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease };
|
|
210
|
+
export type ClaimOptions<T = Record<string, unknown>> = ClaimTargetOptions<T>;
|
|
211
|
+
/**
|
|
212
|
+
* The coordination surface for a model, exposed as a callable namespace.
|
|
213
|
+
*
|
|
214
|
+
* Most callers do not need this namespace directly. Put `claim: { ... }` on a
|
|
215
|
+
* write and the SDK acquires/releases around that one mutation:
|
|
216
|
+
*
|
|
217
|
+
* ```ts
|
|
218
|
+
* await ablo.tasks.update({
|
|
219
|
+
* id,
|
|
220
|
+
* data: { title },
|
|
221
|
+
* claim: {
|
|
222
|
+
* field: 'title',
|
|
223
|
+
* description: 'Renaming the task to match the project brief.',
|
|
224
|
+
* },
|
|
225
|
+
* });
|
|
226
|
+
* ```
|
|
227
|
+
*
|
|
228
|
+
* Use `claim({ id, ... })` when a tool spans multiple writes and needs one
|
|
229
|
+
* handle. `state`, `queue`, and `reorder` are coordination reads/scheduler
|
|
230
|
+
* controls for UI and operators.
|
|
231
|
+
*/
|
|
232
|
+
/**
|
|
233
|
+
* The coordination reads and scheduler controls on a claim namespace, in their
|
|
234
|
+
* reactive (synchronous) form: `state`, `queue`, and `reorder` resolve against
|
|
235
|
+
* the local pool with no round-trip, which is what lets a reactive selector read
|
|
236
|
+
* coordination state inside a React render.
|
|
237
|
+
*
|
|
238
|
+
* This is the single source of truth for the claim read surface. The stateless
|
|
239
|
+
* HTTP client exposes the awaited projection of exactly these methods (derived
|
|
240
|
+
* via {@link AwaitedClaimMethod}), so the two transports cannot drift — change a
|
|
241
|
+
* signature here and the HTTP surface follows.
|
|
242
|
+
*/
|
|
243
|
+
export interface ClaimReadApi<T = Record<string, unknown>> {
|
|
244
|
+
/**
|
|
245
|
+
* Current holder for a row, or `null` when free. Use this for UI badges and
|
|
246
|
+
* preflight checks, not for the normal write path.
|
|
247
|
+
*
|
|
248
|
+
* `target.meta` reads as the shape declared on `Register`'s `ClaimMeta`
|
|
249
|
+
* slot, so no read of it needs a guard. Pass `M` only to override that
|
|
250
|
+
* declaration for one call — `state<OtherMeta>({ id })` — which a program
|
|
251
|
+
* carrying more than one meta shape occasionally needs.
|
|
252
|
+
*/
|
|
253
|
+
state<M = ResolveClaimMeta>(params: ClaimLookupParams<T>): Claim<Record<string, unknown>, M> | null;
|
|
254
|
+
/**
|
|
255
|
+
* FIFO wait line behind the current holder. Advanced: useful for operator
|
|
256
|
+
* UIs and schedulers. Takes the same `meta` parameter as
|
|
257
|
+
* {@link ClaimReadApi.state}.
|
|
258
|
+
*/
|
|
259
|
+
queue<M = ResolveClaimMeta>(params: ClaimLookupParams<T>): {
|
|
260
|
+
readonly object: 'list';
|
|
261
|
+
readonly data: readonly Claim<Record<string, unknown>, M>[];
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* Re-rank the wait line. Advanced and permission-gated.
|
|
265
|
+
*/
|
|
266
|
+
reorder(params: ClaimReorderParams<T>): void;
|
|
267
|
+
/** Release a manual claim handle early. Single-write claims auto-release. */
|
|
268
|
+
release(params: ClaimLookupParams<T> | Claim<T>): Promise<void>;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* The awaited form of a claim method: a synchronous return becomes a `Promise`,
|
|
272
|
+
* an already-async one (`release`) is left untouched. Used to derive the
|
|
273
|
+
* stateless HTTP claim surface from the reactive {@link ClaimReadApi}.
|
|
274
|
+
*/
|
|
275
|
+
export type AwaitedClaimMethod<F> = F extends (...args: infer A) => infer R ? R extends Promise<unknown> ? (...args: A) => R : (...args: A) => Promise<R> : F;
|
|
276
|
+
export interface ClaimApi<T> extends ClaimReadApi<T> {
|
|
277
|
+
/**
|
|
278
|
+
* Takes a claim and returns an explicit held-work handle — a {@link HeldClaim}.
|
|
279
|
+
* `data`, `release`, `revoke`, and the async disposer are always present (this
|
|
280
|
+
* call re-reads the row under the lease), so callers can use `handle.data`
|
|
281
|
+
* directly and `await using` works without a guard.
|
|
282
|
+
*/
|
|
283
|
+
(params: ClaimParams<T>): Promise<HeldClaim<T>>;
|
|
284
|
+
/**
|
|
285
|
+
* Takes a claim by id alone, for a row that lives only in the customer's own
|
|
286
|
+
* database — Ablo has never seen it, so there is nothing to re-read. Returns a
|
|
287
|
+
* {@link HeldLease}: the same lease controls as {@link HeldClaim}
|
|
288
|
+
* (`release`, `revoke`, `heartbeat`, `await using`) but no `.data`. Locking a
|
|
289
|
+
* key you know by id is exactly this — serialize writers without first
|
|
290
|
+
* syncing the row into Ablo.
|
|
291
|
+
*/
|
|
292
|
+
(id: string, opts?: ClaimOptions<T>): Promise<HeldLease>;
|
|
293
|
+
}
|
|
294
|
+
export interface ModelRetrieveParams extends ServerRetrieveOptions {
|
|
295
|
+
readonly id: string;
|
|
296
|
+
}
|
|
297
|
+
export interface ModelCreateParams<T, CreateInput> extends MutationOptions {
|
|
298
|
+
readonly data: CreateInput;
|
|
299
|
+
readonly id?: string | null;
|
|
300
|
+
readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
|
|
301
|
+
}
|
|
302
|
+
export interface ModelUpdateParams<T> extends MutationOptions {
|
|
303
|
+
readonly id: string;
|
|
304
|
+
readonly data: Partial<T>;
|
|
305
|
+
readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
|
|
306
|
+
}
|
|
307
|
+
export interface ModelDeleteParams<T> extends MutationOptions {
|
|
308
|
+
readonly id: string;
|
|
309
|
+
readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
|
|
310
|
+
}
|
|
311
|
+
/** Options for the WebSocket-only `ablo.<model>.join(ids, options?)`. */
|
|
312
|
+
export interface JoinOptions {
|
|
313
|
+
/**
|
|
314
|
+
* Lease TTL for the underlying presence claim — the participant
|
|
315
|
+
* auto-releases after this if the holder dies. Compact duration string
|
|
316
|
+
* (`'5m'`) or ms number, mirroring the claim `ttl`.
|
|
317
|
+
*/
|
|
318
|
+
ttl?: Duration;
|
|
319
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The request contract for `ablo.<model>` — the option and parameter shapes a
|
|
3
|
+
* caller passes to a read, a write, or a claim.
|
|
4
|
+
*
|
|
5
|
+
* These types describe the *change or the query being requested*, never a local
|
|
6
|
+
* copy of the rows it touches, so they sit in the settlement core and are shared
|
|
7
|
+
* by every transport and every caller (ADR 0013 §4, ADR 0016). The factory that
|
|
8
|
+
* binds them to reactive model instances — `createModelProxy` — stays with the
|
|
9
|
+
* reactive consumer, along with `ModelOperations` and `ModelCollaboration`,
|
|
10
|
+
* which reference the live participant handle.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-call options accepted by any mutation.
|
|
3
|
+
*
|
|
4
|
+
* Every field here defines, orders, settles, or authorises *the change itself*
|
|
5
|
+
* — request identity, commit disposition, fencing, and the premise it rests on.
|
|
6
|
+
* None of it touches a local copy of rows, so it belongs with the settlement
|
|
7
|
+
* core rather than the reactive consumer (ADR 0013 §4, ADR 0016).
|
|
8
|
+
*/
|
|
9
|
+
import type { CommitWait } from '../wire/commit.js';
|
|
10
|
+
import type { OnStaleMode, ReadDependency, TrackDependency } from '../coordination/schema.js';
|
|
11
|
+
/**
|
|
12
|
+
* Per-call options accepted by any mutation, passed as the last argument.
|
|
13
|
+
* Every field is optional; omitted fields fall back to sensible defaults.
|
|
14
|
+
*
|
|
15
|
+
* - `idempotencyKey` — when set, the server caches the response for 24 hours and
|
|
16
|
+
* returns the cached result on any retry using the same key. When omitted, the
|
|
17
|
+
* SDK generates a fresh UUID per mutation, so every call is retry-safe by
|
|
18
|
+
* default. `null` is retained for source compatibility and is treated like
|
|
19
|
+
* omission; write retries never opt out of request identity.
|
|
20
|
+
* - `label` — a human-readable tag recorded with the mutation for debugging, such
|
|
21
|
+
* as "nightly cleanup" or "user click".
|
|
22
|
+
*/
|
|
23
|
+
export interface MutationOptions {
|
|
24
|
+
idempotencyKey?: string | null;
|
|
25
|
+
label?: string;
|
|
26
|
+
wait?: CommitWait;
|
|
27
|
+
readAt?: number | null;
|
|
28
|
+
onStale?: OnStaleMode | null;
|
|
29
|
+
/**
|
|
30
|
+
* The fencing token (Option B) of the held claim this write belongs to. The
|
|
31
|
+
* server validates it against the entity's persisted high-water and rejects a
|
|
32
|
+
* stale token. Sourced from the claim handle, never set by hand.
|
|
33
|
+
*/
|
|
34
|
+
fenceToken?: number | null;
|
|
35
|
+
/** The id (or `{ id }`) of the claim this write belongs to. This is the
|
|
36
|
+
* low-level reference the commit carries so the write is attributed to a claim
|
|
37
|
+
* and can pass the holder's own lock. It is distinct from the `claim` handle on
|
|
38
|
+
* the model write parameters, which is the higher-level object you usually pass. */
|
|
39
|
+
claimRef?: string | {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
} | null;
|
|
42
|
+
/**
|
|
43
|
+
* The batch premise — the answer to "did anything I looked at change?" Each
|
|
44
|
+
* entry is a row (`{ model, id, readAt, fields? }`) or a sync group
|
|
45
|
+
* (`{ group, readAt }`) that this write was premised on. The server checks
|
|
46
|
+
* that none of them moved since their `readAt` and applies the entry's
|
|
47
|
+
* `onStale` behavior to the whole batch. This is distinct from the per-operation
|
|
48
|
+
* `readAt`, which guards only the row being written.
|
|
49
|
+
*
|
|
50
|
+
* See `packages/sync-engine/docs/concurrency-convention.md` (§3 the two
|
|
51
|
+
* premises, §4 the batch premise) for the governing convention.
|
|
52
|
+
*/
|
|
53
|
+
reads?: ReadDependency[] | null;
|
|
54
|
+
/**
|
|
55
|
+
* Durable premises — what this write (or the record it produces) should
|
|
56
|
+
* keep watching. Unlike `reads`, which is checked once at commit and discarded,
|
|
57
|
+
* each `track` entry is persisted and re-checked against every future delta; a
|
|
58
|
+
* later matching change opens a `StaleNotification` for the tracking participant,
|
|
59
|
+
* delivered at their next commit or live to a held claim. Each entry is a row
|
|
60
|
+
* (`{ model, id }`) or a sync group (`{ group }`), optionally pinned to a `readAt`
|
|
61
|
+
* baseline (defaults to this commit's watermark).
|
|
62
|
+
*
|
|
63
|
+
* See `packages/sync-engine/docs/groups.md` for how `track` drives propagation.
|
|
64
|
+
*/
|
|
65
|
+
track?: TrackDependency[] | null;
|
|
66
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-call options accepted by any mutation.
|
|
3
|
+
*
|
|
4
|
+
* Every field here defines, orders, settles, or authorises *the change itself*
|
|
5
|
+
* — request identity, commit disposition, fencing, and the premise it rests on.
|
|
6
|
+
* None of it touches a local copy of rows, so it belongs with the settlement
|
|
7
|
+
* core rather than the reactive consumer (ADR 0013 §4, ADR 0016).
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The where-clause grammar carried by a filtered read.
|
|
3
|
+
*
|
|
4
|
+
* A `where` is a flat list of `[column, operator, value]` conditions combined
|
|
5
|
+
* with AND. The protocol carries no model-specific logic: the server compiles a
|
|
6
|
+
* condition against your schema, so adding a model or relation is a schema
|
|
7
|
+
* change rather than a server change.
|
|
8
|
+
*
|
|
9
|
+
* The `IN` operator lets you batch a read by any column, including a foreign
|
|
10
|
+
* key — for example, fetching every block whose `sectionId` falls in a set of ids.
|
|
11
|
+
*
|
|
12
|
+
* These types describe the *request*, not any local copy of the rows it returns,
|
|
13
|
+
* so they live with the settlement core rather than the reactive consumer.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
/** Primitive operand types allowed in a where clause. */
|
|
17
|
+
export type WherePrimitive = string | number | boolean | null;
|
|
18
|
+
/**
|
|
19
|
+
* The comparison operators a {@link WhereClause} may use: equality and
|
|
20
|
+
* inequality, ordering, set membership (`IN` / `NOT IN`), null checks
|
|
21
|
+
* (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
|
|
22
|
+
* matching (`LIKE`, `ILIKE`, and their negations).
|
|
23
|
+
*/
|
|
24
|
+
export declare const whereOpSchema: z.ZodEnum<{
|
|
25
|
+
"=": "=";
|
|
26
|
+
"!=": "!=";
|
|
27
|
+
"<": "<";
|
|
28
|
+
"<=": "<=";
|
|
29
|
+
">": ">";
|
|
30
|
+
">=": ">=";
|
|
31
|
+
IN: "IN";
|
|
32
|
+
"NOT IN": "NOT IN";
|
|
33
|
+
IS: "IS";
|
|
34
|
+
"IS NOT": "IS NOT";
|
|
35
|
+
LIKE: "LIKE";
|
|
36
|
+
"NOT LIKE": "NOT LIKE";
|
|
37
|
+
ILIKE: "ILIKE";
|
|
38
|
+
"NOT ILIKE": "NOT ILIKE";
|
|
39
|
+
}>;
|
|
40
|
+
export type WhereOp = z.infer<typeof whereOpSchema>;
|
|
41
|
+
/**
|
|
42
|
+
* How each operator binds its operand — the classification a compiler needs
|
|
43
|
+
* before it can render or evaluate a condition: a scalar on the right, an array
|
|
44
|
+
* to expand, or a null check with no operand at all. `LIKE_OPS` is the subset
|
|
45
|
+
* whose operand is a pattern and therefore needs pattern validation.
|
|
46
|
+
*
|
|
47
|
+
* These live here, beside the operators, because every consumer of the grammar
|
|
48
|
+
* needs the same split and there is more than one consumer: a where clause is
|
|
49
|
+
* compiled to SQL on a hosted plane and evaluated in memory against the log on
|
|
50
|
+
* a source plane. Two hand-maintained copies of this split meant the same
|
|
51
|
+
* request could be accepted by one plane and rejected by the other — and the
|
|
52
|
+
* pattern-safety set existed on only one of them.
|
|
53
|
+
*/
|
|
54
|
+
export declare const WHERE_SCALAR_OPS: ReadonlySet<WhereOp>;
|
|
55
|
+
export declare const WHERE_ARRAY_OPS: ReadonlySet<WhereOp>;
|
|
56
|
+
export declare const WHERE_NULL_OPS: ReadonlySet<WhereOp>;
|
|
57
|
+
export declare const WHERE_LIKE_OPS: ReadonlySet<WhereOp>;
|
|
58
|
+
/**
|
|
59
|
+
* A single condition. Two supported shapes:
|
|
60
|
+
*
|
|
61
|
+
* - `[col, value]` — shortcut for `[col, '=', value]`
|
|
62
|
+
* - `[col, op, value]` — explicit operator
|
|
63
|
+
*
|
|
64
|
+
* The value is a single primitive for scalar operators and an array of
|
|
65
|
+
* primitives for IN/NOT IN.
|
|
66
|
+
*/
|
|
67
|
+
export type WhereClause = readonly [col: string, value: WherePrimitive] | readonly [col: string, op: WhereOp, value: WherePrimitive | readonly WherePrimitive[]];
|
|
68
|
+
/**
|
|
69
|
+
* Client-facing where shape for `load({where})` and `deleteMany({where})`.
|
|
70
|
+
*
|
|
71
|
+
* Two shapes accepted, both AND-combined:
|
|
72
|
+
*
|
|
73
|
+
* - Object form: `{ name: 'foo', orgId: '1' }` — each entry is an `=`
|
|
74
|
+
* clause; array values become `IN`. Ergonomic for the common case.
|
|
75
|
+
* - Tuple form: `[['name', 'ILIKE', '%Goldman%'], ['orgId', '1']]` —
|
|
76
|
+
* explicit operators (LIKE/ILIKE/<=/etc.). Matches the wire
|
|
77
|
+
* `WhereClause[]` 1:1, so no translation layer.
|
|
78
|
+
*
|
|
79
|
+
* The two forms compose: pass tuple form when you need an operator,
|
|
80
|
+
* object form otherwise. For OR semantics, run two `load()` calls and
|
|
81
|
+
* union client-side — keeps the protocol AND-only.
|
|
82
|
+
*/
|
|
83
|
+
export type LoadWhere<T> = Partial<T> | {
|
|
84
|
+
[K in keyof T]?: T[K] | readonly T[K][];
|
|
85
|
+
} | readonly WhereClause[];
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The where-clause grammar carried by a filtered read.
|
|
3
|
+
*
|
|
4
|
+
* A `where` is a flat list of `[column, operator, value]` conditions combined
|
|
5
|
+
* with AND. The protocol carries no model-specific logic: the server compiles a
|
|
6
|
+
* condition against your schema, so adding a model or relation is a schema
|
|
7
|
+
* change rather than a server change.
|
|
8
|
+
*
|
|
9
|
+
* The `IN` operator lets you batch a read by any column, including a foreign
|
|
10
|
+
* key — for example, fetching every block whose `sectionId` falls in a set of ids.
|
|
11
|
+
*
|
|
12
|
+
* These types describe the *request*, not any local copy of the rows it returns,
|
|
13
|
+
* so they live with the settlement core rather than the reactive consumer.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
/**
|
|
17
|
+
* The comparison operators a {@link WhereClause} may use: equality and
|
|
18
|
+
* inequality, ordering, set membership (`IN` / `NOT IN`), null checks
|
|
19
|
+
* (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
|
|
20
|
+
* matching (`LIKE`, `ILIKE`, and their negations).
|
|
21
|
+
*/
|
|
22
|
+
export const whereOpSchema = z.enum([
|
|
23
|
+
'=',
|
|
24
|
+
'!=',
|
|
25
|
+
'<',
|
|
26
|
+
'<=',
|
|
27
|
+
'>',
|
|
28
|
+
'>=',
|
|
29
|
+
'IN',
|
|
30
|
+
'NOT IN',
|
|
31
|
+
'IS',
|
|
32
|
+
'IS NOT',
|
|
33
|
+
'LIKE',
|
|
34
|
+
'NOT LIKE',
|
|
35
|
+
'ILIKE',
|
|
36
|
+
'NOT ILIKE',
|
|
37
|
+
]);
|
|
38
|
+
/**
|
|
39
|
+
* How each operator binds its operand — the classification a compiler needs
|
|
40
|
+
* before it can render or evaluate a condition: a scalar on the right, an array
|
|
41
|
+
* to expand, or a null check with no operand at all. `LIKE_OPS` is the subset
|
|
42
|
+
* whose operand is a pattern and therefore needs pattern validation.
|
|
43
|
+
*
|
|
44
|
+
* These live here, beside the operators, because every consumer of the grammar
|
|
45
|
+
* needs the same split and there is more than one consumer: a where clause is
|
|
46
|
+
* compiled to SQL on a hosted plane and evaluated in memory against the log on
|
|
47
|
+
* a source plane. Two hand-maintained copies of this split meant the same
|
|
48
|
+
* request could be accepted by one plane and rejected by the other — and the
|
|
49
|
+
* pattern-safety set existed on only one of them.
|
|
50
|
+
*/
|
|
51
|
+
export const WHERE_SCALAR_OPS = new Set([
|
|
52
|
+
'=',
|
|
53
|
+
'!=',
|
|
54
|
+
'<',
|
|
55
|
+
'<=',
|
|
56
|
+
'>',
|
|
57
|
+
'>=',
|
|
58
|
+
'LIKE',
|
|
59
|
+
'NOT LIKE',
|
|
60
|
+
'ILIKE',
|
|
61
|
+
'NOT ILIKE',
|
|
62
|
+
]);
|
|
63
|
+
export const WHERE_ARRAY_OPS = new Set(['IN', 'NOT IN']);
|
|
64
|
+
export const WHERE_NULL_OPS = new Set(['IS', 'IS NOT']);
|
|
65
|
+
export const WHERE_LIKE_OPS = new Set([
|
|
66
|
+
'LIKE',
|
|
67
|
+
'NOT LIKE',
|
|
68
|
+
'ILIKE',
|
|
69
|
+
'NOT ILIKE',
|
|
70
|
+
]);
|
|
@@ -16,11 +16,8 @@
|
|
|
16
16
|
* asserts the shape rather than replacing the value with a parsed copy.
|
|
17
17
|
*/
|
|
18
18
|
import { z } from 'zod';
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
overwrite: "overwrite";
|
|
22
|
-
notify: "notify";
|
|
23
|
-
}>;
|
|
19
|
+
import { onStaleModeSchema } from '../coordination/schema.js';
|
|
20
|
+
export { onStaleModeSchema };
|
|
24
21
|
export declare const writeOptionsSchema: z.ZodObject<{
|
|
25
22
|
idempotencyKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
26
23
|
label: z.ZodOptional<z.ZodString>;
|
|
@@ -38,7 +35,6 @@ export declare const writeOptionsSchema: z.ZodObject<{
|
|
|
38
35
|
claim: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
39
36
|
id: z.ZodString;
|
|
40
37
|
}, z.core.$loose>]>>>;
|
|
41
|
-
causedByTaskId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
42
38
|
}, z.core.$strip>;
|
|
43
39
|
export type WriteOptionsInput = z.infer<typeof writeOptionsSchema>;
|
|
44
40
|
/**
|
|
@@ -17,8 +17,14 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { z } from 'zod';
|
|
19
19
|
import { AbloValidationError } from '../errors.js';
|
|
20
|
-
import {
|
|
21
|
-
|
|
20
|
+
import { commitWaitSchema } from '../wire/commit.js';
|
|
21
|
+
import { onStaleModeSchema } from '../coordination/schema.js';
|
|
22
|
+
// Re-exported, not redeclared. `coordination/schema.ts` owns this enum — it is
|
|
23
|
+
// what the wire schemas and the server validate against — while the published
|
|
24
|
+
// SDK barrel exports the name from this module. Declaring it twice put a second
|
|
25
|
+
// object behind the public export that agreed with the canonical one only by
|
|
26
|
+
// both happening to list the same three strings.
|
|
27
|
+
export { onStaleModeSchema };
|
|
22
28
|
export const writeOptionsSchema = z.object({
|
|
23
29
|
/** Idempotency key the server records in `mutation_log` to make retries
|
|
24
30
|
* safe; `null` opts out of that protection. */
|
|
@@ -26,7 +32,7 @@ export const writeOptionsSchema = z.object({
|
|
|
26
32
|
/** Human-readable audit tag, persisted to `mutation_log.label`. */
|
|
27
33
|
label: z.string().max(255).optional(),
|
|
28
34
|
/** Resolve when queued locally (default) or once the server confirms. */
|
|
29
|
-
wait:
|
|
35
|
+
wait: commitWaitSchema.optional(),
|
|
30
36
|
/** Stale guard: the sync watermark the caller's reasoning was based on. */
|
|
31
37
|
readAt: z.number().int().nonnegative().nullish(),
|
|
32
38
|
/** What the server does when the target moved past `readAt`. */
|
|
@@ -39,8 +45,6 @@ export const writeOptionsSchema = z.object({
|
|
|
39
45
|
/** The claim this write belongs to — either a claim id, or a live claim
|
|
40
46
|
* handle whose `release`/`revoke` functions are preserved untouched. */
|
|
41
47
|
claim: z.union([z.string(), z.looseObject({ id: z.string() })]).nullish(),
|
|
42
|
-
/** Reserved wire-compatibility field; current clients always send `null`. */
|
|
43
|
-
causedByTaskId: z.string().nullish(),
|
|
44
48
|
});
|
|
45
49
|
/**
|
|
46
50
|
* Validates a write-options object against {@link writeOptionsSchema}. On
|
|
@@ -103,18 +103,18 @@ export declare const field: {
|
|
|
103
103
|
*
|
|
104
104
|
* Example:
|
|
105
105
|
* ```ts
|
|
106
|
-
* const
|
|
106
|
+
* const reports = model({
|
|
107
107
|
* metadata: field.json({
|
|
108
|
-
* icon: z.string().default('
|
|
108
|
+
* icon: z.string().default('report'),
|
|
109
109
|
* color: z.string().default('#F59E0B'),
|
|
110
110
|
* summary: z.string().optional(),
|
|
111
111
|
* }),
|
|
112
112
|
* });
|
|
113
113
|
*
|
|
114
114
|
* // At runtime:
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
115
|
+
* report.metadata // raw JSON string (unchanged)
|
|
116
|
+
* report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
|
|
117
|
+
* report.metadataJson.icon // 'report' (typed, with default)
|
|
118
118
|
* ```
|
|
119
119
|
*/
|
|
120
120
|
readonly json: <T extends z.ZodType = z.ZodUnknown>(schemaOrShape?: T | z.ZodRawShape) => FieldBuilder<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
@@ -219,18 +219,18 @@ export const field = {
|
|
|
219
219
|
*
|
|
220
220
|
* Example:
|
|
221
221
|
* ```ts
|
|
222
|
-
* const
|
|
222
|
+
* const reports = model({
|
|
223
223
|
* metadata: field.json({
|
|
224
|
-
* icon: z.string().default('
|
|
224
|
+
* icon: z.string().default('report'),
|
|
225
225
|
* color: z.string().default('#F59E0B'),
|
|
226
226
|
* summary: z.string().optional(),
|
|
227
227
|
* }),
|
|
228
228
|
* });
|
|
229
229
|
*
|
|
230
230
|
* // At runtime:
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
231
|
+
* report.metadata // raw JSON string (unchanged)
|
|
232
|
+
* report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
|
|
233
|
+
* report.metadataJson.icon // 'report' (typed, with default)
|
|
234
234
|
* ```
|
|
235
235
|
*/
|
|
236
236
|
json(schemaOrShape) {
|