@abloatai/ablo 0.34.1 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +758 -5
- package/README.md +56 -502
- package/bin/ablo.cjs +39 -0
- package/dist/BaseSyncedStore.d.ts +176 -48
- package/dist/BaseSyncedStore.js +346 -214
- package/dist/Database.d.ts +17 -44
- package/dist/Database.js +96 -79
- package/dist/InstanceCache.d.ts +31 -6
- package/dist/InstanceCache.js +65 -30
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +23 -13
- package/dist/Model.js +27 -17
- package/dist/ModelRegistry.d.ts +8 -4
- package/dist/ModelRegistry.js +20 -18
- package/dist/NetworkMonitor.d.ts +3 -1
- package/dist/NetworkMonitor.js +7 -5
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +47 -47
- package/dist/SyncClient.js +215 -156
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +129 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +8 -4
- package/dist/client/createInternalComponents.js +17 -10
- package/dist/client/createModelProxy.d.ts +98 -373
- package/dist/client/createModelProxy.js +233 -139
- package/dist/client/humans.d.ts +69 -0
- package/dist/client/humans.js +78 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +53 -0
- package/dist/client/reactiveEngine.js +688 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/storeCluster.d.ts +47 -0
- package/dist/client/storeCluster.js +118 -0
- package/dist/client/storeLifecycle.d.ts +61 -0
- package/dist/client/storeLifecycle.js +231 -0
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +22 -9
- package/dist/context.js +33 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +230 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +44 -36
- package/dist/index.js +30 -22
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +5 -2
- package/dist/query/client.js +10 -9
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +18 -8
- package/dist/react/AbloProvider.js +10 -9
- package/dist/react/context.d.ts +3 -3
- package/dist/react/context.js +1 -1
- package/dist/react/createAbloReact.d.ts +56 -0
- package/dist/react/createAbloReact.js +51 -0
- package/dist/react/index.d.ts +6 -5
- package/dist/react/index.js +6 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +12 -5
- package/dist/react/useAblo.js +26 -8
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +90 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +11 -10
- package/dist/schema/index.js +22 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +6 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +20 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapter.d.ts +7 -5
- package/dist/source/adapter.js +7 -5
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
- package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
- package/dist/{core → stores}/DatabaseManager.js +14 -13
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/{core → stores}/StoreManager.d.ts +9 -26
- package/dist/{core → stores}/StoreManager.js +29 -77
- package/dist/stores/SyncActionStore.d.ts +4 -2
- package/dist/stores/SyncActionStore.js +11 -17
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +127 -6
- package/dist/sync/BootstrapFetcher.js +511 -83
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +5 -2
- package/dist/sync/OnDemandLoader.js +61 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/bootstrapApply.d.ts +3 -0
- package/dist/sync/bootstrapApply.js +2 -2
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +13 -12
- package/dist/sync/deltaPipeline.js +21 -4
- package/dist/sync/groupChange.d.ts +3 -0
- package/dist/sync/groupChange.js +16 -14
- package/dist/sync/participants.d.ts +24 -6
- package/dist/sync/participants.js +32 -23
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +23 -33
- package/dist/sync/schemas.js +29 -20
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/syncLog/contract.d.ts +20 -0
- package/dist/syncLog/contract.js +19 -0
- package/dist/syncLog/index.d.ts +1 -0
- package/dist/syncLog/index.js +1 -0
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +212 -0
- package/dist/transaction/auth/capability.js +224 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +45 -0
- package/dist/transaction/coordination/locator.d.ts +104 -0
- package/dist/transaction/coordination/locator.js +102 -0
- package/dist/transaction/coordination/schema.d.ts +1536 -0
- package/dist/transaction/coordination/schema.js +1177 -0
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +107 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
- package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/footprint.d.ts +111 -0
- package/dist/transaction/footprint.js +0 -0
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +285 -0
- package/dist/transaction/plugin.js +106 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +321 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +427 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +101 -0
- package/dist/transaction/resources/where.js +115 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +17 -23
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/fieldRef.d.ts +38 -0
- package/dist/transaction/schema/fieldRef.js +11 -0
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +58 -0
- package/dist/transaction/schema/openapi.js +501 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
- package/dist/{schema → transaction/schema}/schema.js +24 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/transaction/transport/httpClient.d.ts +131 -0
- package/dist/{client → transaction/transport}/httpClient.js +6 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +295 -97
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +574 -0
- package/dist/transaction/transport/wsTransport.js +1023 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +73 -45
- package/dist/transaction/utils/duration.d.ts +50 -0
- package/dist/{utils → transaction/utils}/duration.js +32 -0
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +420 -0
- package/dist/transaction/wire/accountResponses.js +290 -0
- package/dist/transaction/wire/auth.d.ts +56 -0
- package/dist/transaction/wire/auth.js +63 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +530 -0
- package/dist/transaction/wire/claims.js +327 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +204 -0
- package/dist/transaction/wire/feedEvent.js +65 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +562 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +54 -0
- package/dist/transaction/wire/index.js +83 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelMutations.d.ts +31 -0
- package/dist/transaction/wire/modelMutations.js +52 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transaction/wire/modelShape.d.ts +78 -0
- package/dist/transaction/wire/modelShape.js +74 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/{core → views}/QueryView.d.ts +2 -2
- package/dist/{core → views}/QueryView.js +2 -2
- package/dist/{core → views}/ViewRegistry.d.ts +1 -1
- package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
- package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +20 -13
- package/docs/api-keys.md +14 -10
- package/docs/api.md +27 -61
- package/docs/audit.md +6 -3
- package/docs/cli.md +41 -13
- package/docs/client-behavior.md +11 -9
- package/docs/concurrency-convention.md +49 -57
- package/docs/coordination.md +283 -121
- package/docs/data-sources.md +7 -5
- package/docs/debugging.md +39 -15
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +46 -45
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +87 -30
- package/docs/guarantees.md +41 -12
- package/docs/how-it-works.md +38 -12
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +77 -74
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +31 -19
- package/docs/mcp.md +46 -21
- package/docs/migration.md +95 -18
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +3 -1
- package/docs/quickstart.md +22 -5
- package/docs/react.md +31 -18
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +4 -2
- package/docs/webhooks.md +12 -10
- package/llms.txt +48 -18
- package/package.json +21 -26
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/cli.cjs +0 -286329
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/client/httpClient.d.ts +0 -80
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/coordination/schema.js +0 -578
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -192
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -71
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/duration.d.ts +0 -25
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- package/docs/interaction-model.md +0 -97
- /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
- /package/dist/{core → query}/QueryProcessor.js +0 -0
- /package/dist/{core/storeContract.js → storeContract.js} +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
- /package/dist/{core → views}/ViewRegistry.js +0 -0
|
@@ -0,0 +1,115 @@
|
|
|
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
|
+
import { AbloValidationError } from '../errors.js';
|
|
17
|
+
/**
|
|
18
|
+
* The comparison operators a {@link WhereClause} may use: equality and
|
|
19
|
+
* inequality, ordering, set membership (`IN` / `NOT IN`), null checks
|
|
20
|
+
* (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
|
|
21
|
+
* matching (`LIKE`, `ILIKE`, and their negations).
|
|
22
|
+
*/
|
|
23
|
+
export const whereOpSchema = z.enum([
|
|
24
|
+
'=',
|
|
25
|
+
'!=',
|
|
26
|
+
'<',
|
|
27
|
+
'<=',
|
|
28
|
+
'>',
|
|
29
|
+
'>=',
|
|
30
|
+
'IN',
|
|
31
|
+
'NOT IN',
|
|
32
|
+
'IS',
|
|
33
|
+
'IS NOT',
|
|
34
|
+
'LIKE',
|
|
35
|
+
'NOT LIKE',
|
|
36
|
+
'ILIKE',
|
|
37
|
+
'NOT ILIKE',
|
|
38
|
+
]);
|
|
39
|
+
/**
|
|
40
|
+
* How each operator binds its operand — the classification a compiler needs
|
|
41
|
+
* before it can render or evaluate a condition: a scalar on the right, an array
|
|
42
|
+
* to expand, or a null check with no operand at all. `LIKE_OPS` is the subset
|
|
43
|
+
* whose operand is a pattern and therefore needs pattern validation.
|
|
44
|
+
*
|
|
45
|
+
* These live here, beside the operators, because every consumer of the grammar
|
|
46
|
+
* needs the same split and there is more than one consumer: a where clause is
|
|
47
|
+
* compiled to SQL on a hosted plane and evaluated in memory against the log on
|
|
48
|
+
* a source plane. Two hand-maintained copies of this split meant the same
|
|
49
|
+
* request could be accepted by one plane and rejected by the other — and the
|
|
50
|
+
* pattern-safety set existed on only one of them.
|
|
51
|
+
*/
|
|
52
|
+
export const WHERE_SCALAR_OPS = new Set([
|
|
53
|
+
'=',
|
|
54
|
+
'!=',
|
|
55
|
+
'<',
|
|
56
|
+
'<=',
|
|
57
|
+
'>',
|
|
58
|
+
'>=',
|
|
59
|
+
'LIKE',
|
|
60
|
+
'NOT LIKE',
|
|
61
|
+
'ILIKE',
|
|
62
|
+
'NOT ILIKE',
|
|
63
|
+
]);
|
|
64
|
+
export const WHERE_ARRAY_OPS = new Set(['IN', 'NOT IN']);
|
|
65
|
+
export const WHERE_NULL_OPS = new Set(['IS', 'IS NOT']);
|
|
66
|
+
export const WHERE_LIKE_OPS = new Set([
|
|
67
|
+
'LIKE',
|
|
68
|
+
'NOT LIKE',
|
|
69
|
+
'ILIKE',
|
|
70
|
+
'NOT ILIKE',
|
|
71
|
+
]);
|
|
72
|
+
/**
|
|
73
|
+
* Does this operator accept this operand? The rule the sets above imply, stated
|
|
74
|
+
* once and thrown once.
|
|
75
|
+
*
|
|
76
|
+
* The sets were collapsed here because two copies of the split let one plane
|
|
77
|
+
* accept a request the other refused. The check that consumes them stayed
|
|
78
|
+
* duplicated — the SQL compiler and the log-plane evaluator each carried their
|
|
79
|
+
* own arity tests and their own wording — which leaves the same gap one step
|
|
80
|
+
* further along: relax `IN` in one evaluator and a request succeeds against a
|
|
81
|
+
* hosted plane and fails against a connected one, with no test in a position to
|
|
82
|
+
* notice.
|
|
83
|
+
*
|
|
84
|
+
* Returns the classification the caller needs next, so the check and the branch
|
|
85
|
+
* are the same statement rather than two that can disagree.
|
|
86
|
+
*/
|
|
87
|
+
export function classifyWhereOperand(op, value) {
|
|
88
|
+
if (WHERE_NULL_OPS.has(op)) {
|
|
89
|
+
if (value !== null) {
|
|
90
|
+
throw new AbloValidationError(`${op} only supports null RHS`, {
|
|
91
|
+
code: 'query_unsupported_operator',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return 'null';
|
|
95
|
+
}
|
|
96
|
+
if (WHERE_ARRAY_OPS.has(op)) {
|
|
97
|
+
if (!Array.isArray(value)) {
|
|
98
|
+
throw new AbloValidationError(`${op} requires an array RHS`, {
|
|
99
|
+
code: 'query_unsupported_operator',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return 'array';
|
|
103
|
+
}
|
|
104
|
+
if (WHERE_SCALAR_OPS.has(op)) {
|
|
105
|
+
if (Array.isArray(value)) {
|
|
106
|
+
throw new AbloValidationError(`${op} requires a scalar RHS`, {
|
|
107
|
+
code: 'query_unsupported_operator',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return 'scalar';
|
|
111
|
+
}
|
|
112
|
+
throw new AbloValidationError(`unsupported operator: ${op}`, {
|
|
113
|
+
code: 'query_unsupported_operator',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
@@ -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
|
|
@@ -24,24 +24,18 @@
|
|
|
24
24
|
* });
|
|
25
25
|
*/
|
|
26
26
|
import { z } from 'zod';
|
|
27
|
-
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
* the column from the field name using the active casing convention.
|
|
40
|
-
*/
|
|
41
|
-
column?: string;
|
|
42
|
-
/** For enums: the allowed values. */
|
|
43
|
-
enumValues?: readonly string[];
|
|
44
|
-
}
|
|
27
|
+
/**
|
|
28
|
+
* The sync-engine metadata describing one field, available at runtime through a
|
|
29
|
+
* model's `fields` map. The {@link field} builders attach it, and the migration
|
|
30
|
+
* planner, type generator, and OpenAPI generator all read it.
|
|
31
|
+
*
|
|
32
|
+
* Declared in `wire/modelShape.ts` and inferred here, not restated: this record
|
|
33
|
+
* crosses the wire twice — serialized into the pushed artifact, and reported
|
|
34
|
+
* back by `GET /api/schema` — so a second declaration would be a copy that
|
|
35
|
+
* drifts in whichever direction nobody is looking.
|
|
36
|
+
*/
|
|
37
|
+
export type { FieldMeta } from '../wire/modelShape.js';
|
|
38
|
+
import type { FieldMeta } from '../wire/modelShape.js';
|
|
45
39
|
/**
|
|
46
40
|
* Extract FieldMeta from a Zod schema. Returns null if no sync-engine
|
|
47
41
|
* metadata is attached (e.g., raw `z.string()` usage).
|
|
@@ -103,18 +97,18 @@ export declare const field: {
|
|
|
103
97
|
*
|
|
104
98
|
* Example:
|
|
105
99
|
* ```ts
|
|
106
|
-
* const
|
|
100
|
+
* const reports = model({
|
|
107
101
|
* metadata: field.json({
|
|
108
|
-
* icon: z.string().default('
|
|
102
|
+
* icon: z.string().default('report'),
|
|
109
103
|
* color: z.string().default('#F59E0B'),
|
|
110
104
|
* summary: z.string().optional(),
|
|
111
105
|
* }),
|
|
112
106
|
* });
|
|
113
107
|
*
|
|
114
108
|
* // At runtime:
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
109
|
+
* report.metadata // raw JSON string (unchanged)
|
|
110
|
+
* report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
|
|
111
|
+
* report.metadataJson.icon // 'report' (typed, with default)
|
|
118
112
|
* ```
|
|
119
113
|
*/
|
|
120
114
|
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) {
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A reference to one field of one model — the field as a value rather than as
|
|
3
|
+
* a quoted name.
|
|
4
|
+
*
|
|
5
|
+
* A model is declared as Zod schemas keyed by name, so a field's name lives on
|
|
6
|
+
* the object key and never on the value: `model({ status: z.enum([...]) })`
|
|
7
|
+
* gives you nothing to point at, and every surface that needs to name a field
|
|
8
|
+
* has had to quote it. `fields: ['titel']` then compiles, is granted, excludes
|
|
9
|
+
* nobody, and leaves the write of `title` unguarded — the conflict rule
|
|
10
|
+
* compares names as opaque strings, so an invented one matches no other claim
|
|
11
|
+
* and nothing reports it.
|
|
12
|
+
*
|
|
13
|
+
* {@link Schema.fields} carries one of these per field, stamped from the key
|
|
14
|
+
* `defineSchema` is already holding. Referencing a field that does not exist
|
|
15
|
+
* stops compiling, and renaming one is a compile error at every use rather than
|
|
16
|
+
* a claim that quietly stops matching.
|
|
17
|
+
*
|
|
18
|
+
* An object rather than a branded string, for the reason `ClaimPart` is one: a
|
|
19
|
+
* brand makes a concrete schema's claim params mutually unassignable with the
|
|
20
|
+
* erased `SchemaRecord` view, and the react context boundary erases and
|
|
21
|
+
* restores exactly that way. Objects stay pairwise comparable across it, which
|
|
22
|
+
* a union of literal keys does not — function parameters are contravariant, so
|
|
23
|
+
* a claim accepting `'title' | 'status'` is not assignable to one accepting
|
|
24
|
+
* `string`.
|
|
25
|
+
*
|
|
26
|
+
* `model` rides along so a reference carries where it came from. Claiming
|
|
27
|
+
* `users.email` through `ablo.tasks` is a mistake nothing can currently see.
|
|
28
|
+
*/
|
|
29
|
+
export interface FieldRef {
|
|
30
|
+
/** The schema key of the model this field belongs to. */
|
|
31
|
+
readonly model: string;
|
|
32
|
+
/** The field's own name — the key it was declared under. */
|
|
33
|
+
readonly field: string;
|
|
34
|
+
}
|
|
35
|
+
/** Whether a value is a {@link FieldRef}. */
|
|
36
|
+
export declare function isFieldRef(value: unknown): value is FieldRef;
|
|
37
|
+
/** Build the reference for one declared field. */
|
|
38
|
+
export declare function fieldRef(model: string, field: string): FieldRef;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Whether a value is a {@link FieldRef}. */
|
|
2
|
+
export function isFieldRef(value) {
|
|
3
|
+
return (typeof value === 'object' &&
|
|
4
|
+
value !== null &&
|
|
5
|
+
typeof value.field === 'string' &&
|
|
6
|
+
typeof value.model === 'string');
|
|
7
|
+
}
|
|
8
|
+
/** Build the reference for one declared field. */
|
|
9
|
+
export function fieldRef(model, field) {
|
|
10
|
+
return { model, field };
|
|
11
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* When a model's rows are loaded from the server.
|
|
3
|
+
*
|
|
4
|
+
* - `instant` — loaded during bootstrap, before the model is first used.
|
|
5
|
+
* - `lazy` — loaded all at once on first access.
|
|
6
|
+
*
|
|
7
|
+
* One declaration serves both sides of the seam. `LoadStrategy.instant` is the
|
|
8
|
+
* value the engine branches on once a model is registered; `'instant'` is the
|
|
9
|
+
* word an author writes in `model(…, { load })`. They are the same name because
|
|
10
|
+
* they are the same axis — a const object merged with the type of its own
|
|
11
|
+
* values, rather than an enum, because a string enum is nominal and would
|
|
12
|
+
* refuse the plain `'instant'` an author actually types.
|
|
13
|
+
*
|
|
14
|
+
* The set is deliberately this small. It previously named `partial`,
|
|
15
|
+
* `explicitlyRequested`, and `local` on the runtime side and `manual` on the
|
|
16
|
+
* authoring side, and not one of those was reachable end to end: `manual` had
|
|
17
|
+
* no implementation and resolved to `lazy`, while the other three had no way to
|
|
18
|
+
* be declared. A member no schema can produce, or no branch can observe, is a
|
|
19
|
+
* promise the engine has no way to keep.
|
|
20
|
+
*/
|
|
21
|
+
export declare const LoadStrategy: {
|
|
22
|
+
/** Loaded during startup, before it is first used — for models needed right away. */
|
|
23
|
+
readonly instant: "instant";
|
|
24
|
+
/** Loaded all at once the first time it is needed — for secondary models. */
|
|
25
|
+
readonly lazy: "lazy";
|
|
26
|
+
};
|
|
27
|
+
export type LoadStrategy = (typeof LoadStrategy)[keyof typeof LoadStrategy];
|
|
28
|
+
/** The strategy a model gets when it declares none. */
|
|
29
|
+
export declare const DEFAULT_LOAD_STRATEGY: LoadStrategy;
|
|
30
|
+
/**
|
|
31
|
+
* Whether a model's rows arrive in the bootstrap payload rather than on first
|
|
32
|
+
* access. This is the question the client asks when it builds the bootstrap
|
|
33
|
+
* subscription and the question the server asks when it assembles the payload,
|
|
34
|
+
* and the two must answer it identically or a model is requested by one side
|
|
35
|
+
* and withheld by the other.
|
|
36
|
+
*
|
|
37
|
+
* It is a function rather than a comparison spelled at each site because the
|
|
38
|
+
* sites disagreed about how to spell it: one asked `load !== 'lazy'`, another
|
|
39
|
+
* `load === 'instant'`, a third `load === 'lazy' ? … : …`. Against a two-member
|
|
40
|
+
* set those are the same predicate, so nothing failed. Against a third member
|
|
41
|
+
* they are three different predicates, and the first would have enrolled it in
|
|
42
|
+
* bootstrap while the second withheld it — the kind of split that surfaces as
|
|
43
|
+
* rows that never arrive, far from the line that caused it.
|
|
44
|
+
*/
|
|
45
|
+
export declare function loadsAtBootstrap(load: LoadStrategy | undefined): boolean;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* When a model's rows are loaded from the server.
|
|
3
|
+
*
|
|
4
|
+
* - `instant` — loaded during bootstrap, before the model is first used.
|
|
5
|
+
* - `lazy` — loaded all at once on first access.
|
|
6
|
+
*
|
|
7
|
+
* One declaration serves both sides of the seam. `LoadStrategy.instant` is the
|
|
8
|
+
* value the engine branches on once a model is registered; `'instant'` is the
|
|
9
|
+
* word an author writes in `model(…, { load })`. They are the same name because
|
|
10
|
+
* they are the same axis — a const object merged with the type of its own
|
|
11
|
+
* values, rather than an enum, because a string enum is nominal and would
|
|
12
|
+
* refuse the plain `'instant'` an author actually types.
|
|
13
|
+
*
|
|
14
|
+
* The set is deliberately this small. It previously named `partial`,
|
|
15
|
+
* `explicitlyRequested`, and `local` on the runtime side and `manual` on the
|
|
16
|
+
* authoring side, and not one of those was reachable end to end: `manual` had
|
|
17
|
+
* no implementation and resolved to `lazy`, while the other three had no way to
|
|
18
|
+
* be declared. A member no schema can produce, or no branch can observe, is a
|
|
19
|
+
* promise the engine has no way to keep.
|
|
20
|
+
*/
|
|
21
|
+
export const LoadStrategy = {
|
|
22
|
+
/** Loaded during startup, before it is first used — for models needed right away. */
|
|
23
|
+
instant: 'instant',
|
|
24
|
+
/** Loaded all at once the first time it is needed — for secondary models. */
|
|
25
|
+
lazy: 'lazy',
|
|
26
|
+
};
|
|
27
|
+
/** The strategy a model gets when it declares none. */
|
|
28
|
+
export const DEFAULT_LOAD_STRATEGY = LoadStrategy.instant;
|
|
29
|
+
/**
|
|
30
|
+
* Whether a model's rows arrive in the bootstrap payload rather than on first
|
|
31
|
+
* access. This is the question the client asks when it builds the bootstrap
|
|
32
|
+
* subscription and the question the server asks when it assembles the payload,
|
|
33
|
+
* and the two must answer it identically or a model is requested by one side
|
|
34
|
+
* and withheld by the other.
|
|
35
|
+
*
|
|
36
|
+
* It is a function rather than a comparison spelled at each site because the
|
|
37
|
+
* sites disagreed about how to spell it: one asked `load !== 'lazy'`, another
|
|
38
|
+
* `load === 'instant'`, a third `load === 'lazy' ? … : …`. Against a two-member
|
|
39
|
+
* set those are the same predicate, so nothing failed. Against a third member
|
|
40
|
+
* they are three different predicates, and the first would have enrolled it in
|
|
41
|
+
* bootstrap while the second withheld it — the kind of split that surfaces as
|
|
42
|
+
* rows that never arrive, far from the line that caused it.
|
|
43
|
+
*/
|
|
44
|
+
export function loadsAtBootstrap(load) {
|
|
45
|
+
return (load ?? DEFAULT_LOAD_STRATEGY) === LoadStrategy.instant;
|
|
46
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Defines a model — one table's worth of fields
|
|
3
|
-
*
|
|
4
|
-
* type is inferred directly from Zod, with no
|
|
2
|
+
* Defines a model — one table's worth of fields, and one options object holding
|
|
3
|
+
* everything else the engine needs to know about it. A model is a Zod object schema
|
|
4
|
+
* paired with those options; the row type is inferred directly from Zod, with no
|
|
5
|
+
* separate type system to keep in sync.
|
|
5
6
|
*
|
|
6
7
|
* Usage:
|
|
7
8
|
* import { z } from 'zod';
|
|
@@ -12,7 +13,8 @@
|
|
|
12
13
|
* status: z.enum(['todo', 'doing', 'done']).default('todo'),
|
|
13
14
|
* projectId: z.string().optional(),
|
|
14
15
|
* }, {
|
|
15
|
-
* project: relation.belongsTo('projects', 'projectId'),
|
|
16
|
+
* relations: { project: relation.belongsTo('projects', 'projectId') },
|
|
17
|
+
* load: 'lazy',
|
|
16
18
|
* });
|
|
17
19
|
*/
|
|
18
20
|
import { z } from 'zod';
|
|
@@ -24,14 +26,8 @@ export type { ScopedViaRef, Tenancy, PolicyInput } from './tenancy.js';
|
|
|
24
26
|
import { type ModelResidency } from './residency.js';
|
|
25
27
|
import type { ConflictAxis } from '../policy/types.js';
|
|
26
28
|
export type { ConflictAxis } from '../policy/types.js';
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
*
|
|
30
|
-
* - `'instant'` — loaded during bootstrap (appears immediately on page load)
|
|
31
|
-
* - `'lazy'` — loaded on first access (e.g., when you navigate to a page that needs it)
|
|
32
|
-
* - `'manual'` — only loaded when you explicitly call sync.model.load()
|
|
33
|
-
*/
|
|
34
|
-
export type LoadStrategy = 'instant' | 'lazy' | 'manual';
|
|
29
|
+
import { LoadStrategy } from './loadStrategy.js';
|
|
30
|
+
export { LoadStrategy, DEFAULT_LOAD_STRATEGY, loadsAtBootstrap } from './loadStrategy.js';
|
|
35
31
|
/** A record of relation definitions */
|
|
36
32
|
export type RelationRecord = Record<string, RelationDef>;
|
|
37
33
|
/**
|
|
@@ -58,11 +54,26 @@ export interface PersistOptions {
|
|
|
58
54
|
export interface GrantsRef {
|
|
59
55
|
/** Relation name pointing at the identity that gains access (e.g. `'user'`). */
|
|
60
56
|
subject: string;
|
|
61
|
-
/** Relation name pointing at the scope-root entity (e.g. `'
|
|
57
|
+
/** Relation name pointing at the scope-root entity (e.g. `'workspace'`). */
|
|
62
58
|
scope: string;
|
|
63
59
|
}
|
|
64
60
|
/** Options for model() */
|
|
65
61
|
export interface ModelOptions {
|
|
62
|
+
/**
|
|
63
|
+
* Edges from this model to others, keyed by the accessor name they create. The
|
|
64
|
+
* engine reads them to index foreign keys, to order inserts so a parent row lands
|
|
65
|
+
* before the rows referencing it, and to generate the accessors that let you read
|
|
66
|
+
* `task.project` or `project.tasks` directly. Built with the {@link relation}
|
|
67
|
+
* factories.
|
|
68
|
+
*
|
|
69
|
+
* ```ts
|
|
70
|
+
* relations: {
|
|
71
|
+
* project: relation.belongsTo('projects', 'projectId'),
|
|
72
|
+
* comments: relation.hasMany('comments', 'taskId'),
|
|
73
|
+
* }
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
relations?: RelationRecord;
|
|
66
77
|
/** When to load this model's data. Default: 'instant' */
|
|
67
78
|
load?: LoadStrategy;
|
|
68
79
|
/** Max records to bootstrap. Default: unlimited. Only applies to 'instant' strategy. */
|
|
@@ -74,7 +85,7 @@ export interface ModelOptions {
|
|
|
74
85
|
* wire (the `__typename`). The loader stamps it onto incoming rows and uses it to
|
|
75
86
|
* find the matching model class. It defaults to the schema key (`tasks` →
|
|
76
87
|
* `'tasks'`); set it explicitly when the wire shape uses different casing, such as
|
|
77
|
-
* schema key `
|
|
88
|
+
* schema key `block` mapping to typename `'Block'`.
|
|
78
89
|
*
|
|
79
90
|
* This is the one value that identifies the model on the wire; the client-side
|
|
80
91
|
* store name, query result references, and delta routing all resolve through it.
|
|
@@ -98,8 +109,8 @@ export interface ModelOptions {
|
|
|
98
109
|
* omitted). `column` overrides the column name, which defaults to
|
|
99
110
|
* `organization_id`.
|
|
100
111
|
* - `{ by: 'parent', fk, parent }` — inherit tenancy through a foreign key when the
|
|
101
|
-
* table has no tenancy column of its own (for example `
|
|
102
|
-
*
|
|
112
|
+
* table has no tenancy column of its own (for example `blocks` → section →
|
|
113
|
+
* report → organization). In place of `organization_id = $1` the read emits
|
|
103
114
|
* `WHERE <table>.<fk> IN (SELECT <parentKey> FROM <parent> WHERE
|
|
104
115
|
* <parentTenantColumn> = $1)`. Use it for any `load: 'instant'` child table that
|
|
105
116
|
* would otherwise expose other tenants' rows at bootstrap.
|
|
@@ -125,8 +136,8 @@ export interface ModelOptions {
|
|
|
125
136
|
* optional parts:
|
|
126
137
|
*
|
|
127
138
|
* - `root` — marks this model a scope root, so each of its records forms the group
|
|
128
|
-
* `<kind>:<id>`. The kind defaults to the lowercased typename (`
|
|
129
|
-
* `
|
|
139
|
+
* `<kind>:<id>`. The kind defaults to the lowercased typename (`Report` →
|
|
140
|
+
* `report:<id>`); pass a string to override it (`root: 'matter'`). Child models
|
|
130
141
|
* inherit a root's group through their `belongsTo` relations.
|
|
131
142
|
* - `grants` — a membership edge that grants an identity access to a scope root.
|
|
132
143
|
* Both values name `belongsTo` relations on this model (`subject` names the
|
|
@@ -138,7 +149,7 @@ export interface ModelOptions {
|
|
|
138
149
|
*
|
|
139
150
|
* ```ts
|
|
140
151
|
* // dataroomMember: { userId, dataroomId }
|
|
141
|
-
* groups: { grants: { subject: 'user', scope: '
|
|
152
|
+
* groups: { grants: { subject: 'user', scope: 'workspace' } }
|
|
142
153
|
* // a message → its addressee's inbox, keyed on `toId`
|
|
143
154
|
* groups: { roles: [entityRole({ kind: 'inbox', source: 'toId' })] }
|
|
144
155
|
* ```
|
|
@@ -196,7 +207,7 @@ export interface ModelOptions {
|
|
|
196
207
|
* value.
|
|
197
208
|
*
|
|
198
209
|
* @example
|
|
199
|
-
* model({ title: z.string(), metadata: z.string() }, {
|
|
210
|
+
* model({ title: z.string(), metadata: z.string() }, {
|
|
200
211
|
* computed: {
|
|
201
212
|
* displayTitle: (self) => self.title || `Untitled`,
|
|
202
213
|
* metadataObject: (self) => {
|
|
@@ -233,7 +244,7 @@ export interface ModelOptions {
|
|
|
233
244
|
* loaded. Use it for foreign keys whose absence would crash code that depends on
|
|
234
245
|
* them — for example a child row that cannot be placed without its parent's id.
|
|
235
246
|
*
|
|
236
|
-
* @example requiredFields: ['
|
|
247
|
+
* @example requiredFields: ['sectionId']
|
|
237
248
|
*/
|
|
238
249
|
requiredFields?: readonly string[];
|
|
239
250
|
}
|
|
@@ -321,40 +332,44 @@ export interface ModelDef<Shape extends z.ZodRawShape = z.ZodRawShape, R extends
|
|
|
321
332
|
readonly requiredFields?: readonly string[];
|
|
322
333
|
}
|
|
323
334
|
/**
|
|
324
|
-
* Defines a model from a Zod shape
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
*
|
|
335
|
+
* Defines a model from a Zod shape and its options. The row type is inferred from
|
|
336
|
+
* the shape; fields built with the {@link field} builders carry extra metadata,
|
|
337
|
+
* while plain Zod fields get metadata inferred from their Zod type. Everything else
|
|
338
|
+
* about the model — its {@link ModelOptions.relations}, its {@link LoadStrategy},
|
|
339
|
+
* the table it maps to — lives in the second argument, so a model that needs one
|
|
340
|
+
* setting never has to name the settings it does not use.
|
|
328
341
|
*
|
|
329
342
|
* ```ts
|
|
330
343
|
* import { z } from 'zod';
|
|
331
344
|
* import { model, relation } from '@abloatai/ablo/schema';
|
|
332
345
|
*
|
|
333
|
-
* //
|
|
346
|
+
* // Fields alone
|
|
347
|
+
* const tags = model({ label: z.string() });
|
|
348
|
+
*
|
|
349
|
+
* // Loaded at bootstrap (the default), with an edge to its project
|
|
334
350
|
* const tasks = model({
|
|
335
351
|
* title: z.string(),
|
|
336
352
|
* status: z.enum(['todo', 'doing', 'done']).default('todo'),
|
|
337
353
|
* projectId: z.string().optional(),
|
|
338
354
|
* }, {
|
|
339
|
-
* project: relation.belongsTo('projects', 'projectId'),
|
|
355
|
+
* relations: { project: relation.belongsTo('projects', 'projectId') },
|
|
340
356
|
* });
|
|
341
357
|
*
|
|
342
358
|
* // Loaded on first access
|
|
343
|
-
* const
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
* // Loaded only when explicitly requested
|
|
348
|
-
* const auditLogs = model({ action: z.string() }, {}, { load: 'manual' });
|
|
359
|
+
* const blocks = model({ sectionId: z.string(), type: z.string() }, {
|
|
360
|
+
* relations: { section: relation.belongsTo('sections', 'sectionId') },
|
|
361
|
+
* load: 'lazy',
|
|
362
|
+
* });
|
|
349
363
|
* ```
|
|
350
364
|
*/
|
|
351
|
-
export declare function model<Shape extends z.ZodRawShape, R extends RelationRecord = Record<string, never>, C extends ComputedRecord = Record<string, never>>(shape: Shape,
|
|
365
|
+
export declare function model<Shape extends z.ZodRawShape, R extends RelationRecord = Record<string, never>, C extends ComputedRecord = Record<string, never>>(shape: Shape, options?: ModelOptions & {
|
|
366
|
+
relations?: R;
|
|
352
367
|
computed?: C;
|
|
353
368
|
}): ModelDef<Shape, R, C>;
|
|
354
369
|
/**
|
|
355
370
|
* Returns the sync-group kind a scope-root model produces, or `undefined` when the
|
|
356
371
|
* model is not a scope root. `scope: true` derives the kind from the lowercased
|
|
357
|
-
* typename (`
|
|
372
|
+
* typename (`ReportSection` → `reportsection`); `scope: 'section'` sets it explicitly, which
|
|
358
373
|
* you use when the wire kind must differ from the typename. This is the single place
|
|
359
374
|
* that decides a record's own group, so every layer that reads it agrees.
|
|
360
375
|
*/
|