@abloatai/ablo 0.34.0 → 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 +4 -1
- package/CHANGELOG.md +684 -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 +3459 -1126
- 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 -84
- 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 +111 -0
- 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,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
|
*/
|
|
@@ -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';
|
|
@@ -28,36 +30,44 @@ function normalizeEntityRoles(input) {
|
|
|
28
30
|
return undefined;
|
|
29
31
|
return Array.isArray(input) ? input : [input];
|
|
30
32
|
}
|
|
33
|
+
// ── Load strategies ───────────────────────────────────────────────────────
|
|
34
|
+
// Defined in `./loadStrategy.ts`. Imported as well as re-exported: a bare
|
|
35
|
+
// `export … from` would not bind the name for the `load` fields below.
|
|
36
|
+
import { LoadStrategy, DEFAULT_LOAD_STRATEGY } from './loadStrategy.js';
|
|
37
|
+
export { LoadStrategy, DEFAULT_LOAD_STRATEGY, loadsAtBootstrap } from './loadStrategy.js';
|
|
31
38
|
// ── Model factory ─────────────────────────────────────────────────────────
|
|
32
39
|
/**
|
|
33
|
-
* Defines a model from a Zod shape
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
40
|
+
* Defines a model from a Zod shape and its options. The row type is inferred from
|
|
41
|
+
* the shape; fields built with the {@link field} builders carry extra metadata,
|
|
42
|
+
* while plain Zod fields get metadata inferred from their Zod type. Everything else
|
|
43
|
+
* about the model — its {@link ModelOptions.relations}, its {@link LoadStrategy},
|
|
44
|
+
* the table it maps to — lives in the second argument, so a model that needs one
|
|
45
|
+
* setting never has to name the settings it does not use.
|
|
37
46
|
*
|
|
38
47
|
* ```ts
|
|
39
48
|
* import { z } from 'zod';
|
|
40
49
|
* import { model, relation } from '@abloatai/ablo/schema';
|
|
41
50
|
*
|
|
42
|
-
* //
|
|
51
|
+
* // Fields alone
|
|
52
|
+
* const tags = model({ label: z.string() });
|
|
53
|
+
*
|
|
54
|
+
* // Loaded at bootstrap (the default), with an edge to its project
|
|
43
55
|
* const tasks = model({
|
|
44
56
|
* title: z.string(),
|
|
45
57
|
* status: z.enum(['todo', 'doing', 'done']).default('todo'),
|
|
46
58
|
* projectId: z.string().optional(),
|
|
47
59
|
* }, {
|
|
48
|
-
* project: relation.belongsTo('projects', 'projectId'),
|
|
60
|
+
* relations: { project: relation.belongsTo('projects', 'projectId') },
|
|
49
61
|
* });
|
|
50
62
|
*
|
|
51
63
|
* // Loaded on first access
|
|
52
|
-
* const
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* // Loaded only when explicitly requested
|
|
57
|
-
* const auditLogs = model({ action: z.string() }, {}, { load: 'manual' });
|
|
64
|
+
* const blocks = model({ sectionId: z.string(), type: z.string() }, {
|
|
65
|
+
* relations: { section: relation.belongsTo('sections', 'sectionId') },
|
|
66
|
+
* load: 'lazy',
|
|
67
|
+
* });
|
|
58
68
|
* ```
|
|
59
69
|
*/
|
|
60
|
-
export function model(shape,
|
|
70
|
+
export function model(shape, options) {
|
|
61
71
|
// Build the fields metadata record by walking the Zod shape.
|
|
62
72
|
// Fields built with `field.*()` have structured metadata; fields built
|
|
63
73
|
// with raw Zod get a fallback derived from the Zod typeName.
|
|
@@ -75,8 +85,8 @@ export function model(shape, relations, options) {
|
|
|
75
85
|
schema: z.object(shape),
|
|
76
86
|
shape,
|
|
77
87
|
fields,
|
|
78
|
-
relations: (relations ?? {}),
|
|
79
|
-
load: options?.load ??
|
|
88
|
+
relations: (options?.relations ?? {}),
|
|
89
|
+
load: options?.load ?? DEFAULT_LOAD_STRATEGY,
|
|
80
90
|
bootstrapLimit: options?.bootstrapLimit,
|
|
81
91
|
bootstrapOrderBy: options?.bootstrapOrderBy,
|
|
82
92
|
typename: options?.typename,
|
|
@@ -102,7 +112,7 @@ export function model(shape, relations, options) {
|
|
|
102
112
|
/**
|
|
103
113
|
* Returns the sync-group kind a scope-root model produces, or `undefined` when the
|
|
104
114
|
* model is not a scope root. `scope: true` derives the kind from the lowercased
|
|
105
|
-
* typename (`
|
|
115
|
+
* typename (`ReportSection` → `reportsection`); `scope: 'section'` sets it explicitly, which
|
|
106
116
|
* you use when the wire kind must differ from the typename. This is the single place
|
|
107
117
|
* that decides a record's own group, so every layer that reads it agrees.
|
|
108
118
|
*/
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Two OpenAPI 3.1 documents describing the same API, for two different readers.
|
|
3
|
+
*
|
|
4
|
+
* The server registers ONE parameterised route family — `/api/v1/models/:model`,
|
|
5
|
+
* `/:id`, `/:id/claim`, `/claim/heartbeat`, `/claim/reorder`, plus `/v1/commits`.
|
|
6
|
+
* Six routes, whatever a tenant's schema contains. Authentication is a single
|
|
7
|
+
* Bearer scheme, your API key.
|
|
8
|
+
*
|
|
9
|
+
* {@link abloOpenApi} publishes exactly those six. It takes no schema, so it
|
|
10
|
+
* cannot grow with one: identical for every caller, stable across every push,
|
|
11
|
+
* and the document a Python or Go client is generated from once.
|
|
12
|
+
*
|
|
13
|
+
* {@link schemaToOpenApi} expands the same six into one set per model, with
|
|
14
|
+
* payloads typed from each model's introspectable {@link FieldMeta}. Five paths
|
|
15
|
+
* per model, regenerated on every push — worth it when you want generated types
|
|
16
|
+
* for one schema, and the wrong thing to hand an agent.
|
|
17
|
+
*
|
|
18
|
+
* Both return a plain JSON-serializable object; feed either into codegen (for
|
|
19
|
+
* example `ablo openapi > openapi.json`) or serve it directly.
|
|
20
|
+
*/
|
|
21
|
+
import type { Schema, SchemaRecord } from './schema.js';
|
|
22
|
+
/** Options for {@link schemaToOpenApi} — the metadata stamped into the generated spec. */
|
|
23
|
+
export interface SchemaToOpenApiOptions {
|
|
24
|
+
/** Spec title. Default `"Ablo API"`. */
|
|
25
|
+
readonly title?: string;
|
|
26
|
+
/** Spec version. Default `"1.0.0"`. */
|
|
27
|
+
readonly version?: string;
|
|
28
|
+
/** API base URL. Default `"https://api.abloatai.com/api"`. */
|
|
29
|
+
readonly serverUrl?: string;
|
|
30
|
+
}
|
|
31
|
+
type Json = Record<string, unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* The protocol reference: the five route templates the server actually serves,
|
|
34
|
+
* plus `/v1/commits`.
|
|
35
|
+
*
|
|
36
|
+
* This takes no schema, and that is the point. The server registers one
|
|
37
|
+
* parameterised route family (`/api/v1/models/:model/...`), so the API is five
|
|
38
|
+
* routes no matter how many models a tenant defines — and a spec that cannot see
|
|
39
|
+
* a schema cannot grow with one. It is publishable once, identical for every
|
|
40
|
+
* caller, and stable across every schema push: the document a Python or Go
|
|
41
|
+
* client is generated from, and the surface an agent is handed.
|
|
42
|
+
*
|
|
43
|
+
* Payload shapes are generic here by design. A caller that wants them typed
|
|
44
|
+
* either reads the schema at runtime or generates the per-tenant expansion with
|
|
45
|
+
* {@link schemaToOpenApi}.
|
|
46
|
+
*/
|
|
47
|
+
export declare function abloOpenApi(options?: SchemaToOpenApiOptions): Json;
|
|
48
|
+
/**
|
|
49
|
+
* The per-tenant expansion: every model's routes written out with typed payloads.
|
|
50
|
+
*
|
|
51
|
+
* Useful when you want generated types for one schema — five paths per model, so
|
|
52
|
+
* it grows with the schema and is regenerated on every push. It documents the
|
|
53
|
+
* same five routes {@link abloOpenApi} describes; it does not describe a
|
|
54
|
+
* different API.
|
|
55
|
+
*/
|
|
56
|
+
export declare function schemaToOpenApi<S extends SchemaRecord>(schema: Schema<S>, options?: SchemaToOpenApiOptions): Json;
|
|
57
|
+
export {};
|