@abloatai/ablo 0.35.0 → 0.37.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 -2
- package/CHANGELOG.md +71 -1929
- package/NOTICE +2 -2
- package/README.md +23 -532
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -112
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -161
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.js.map +1 -0
- package/dist/source-drizzle.d.ts +2 -0
- package/dist/source-drizzle.d.ts.map +1 -0
- package/dist/source-drizzle.js +2 -0
- package/dist/source-drizzle.js.map +1 -0
- package/dist/source-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +2 -2
- package/docs/api-keys.md +13 -12
- package/docs/api.md +15 -53
- package/docs/audit.md +4 -3
- package/docs/cli.md +11 -11
- package/docs/client-behavior.md +9 -9
- package/docs/concurrency-convention.md +28 -42
- package/docs/coordination.md +228 -86
- package/docs/data-sources.md +5 -5
- package/docs/debugging.md +34 -12
- package/docs/deployment.md +8 -8
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/scoped-agent.md +3 -3
- package/docs/examples/server-agent.md +2 -2
- package/docs/groups.md +57 -3
- package/docs/guarantees.md +37 -10
- package/docs/how-it-works.md +32 -8
- package/docs/idempotency.md +6 -6
- package/docs/identity.md +24 -24
- package/docs/index.md +8 -8
- package/docs/integration-guide.md +38 -16
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +9 -9
- package/docs/migration.md +37 -18
- package/docs/projects.md +1 -1
- package/docs/quickstart.md +2 -2
- package/docs/react.md +24 -13
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/docs/webhooks.md +9 -9
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +12 -12
- package/package.json +64 -174
- package/dist/BaseSyncedStore.d.ts +0 -823
- package/dist/BaseSyncedStore.js +0 -1955
- package/dist/Database.d.ts +0 -335
- package/dist/Database.js +0 -1500
- package/dist/InstanceCache.d.ts +0 -233
- package/dist/InstanceCache.js +0 -1164
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -444
- package/dist/Model.js +0 -909
- package/dist/ModelRegistry.d.ts +0 -221
- package/dist/ModelRegistry.js +0 -537
- package/dist/NetworkMonitor.d.ts +0 -26
- package/dist/NetworkMonitor.js +0 -77
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -551
- package/dist/SyncClient.js +0 -2199
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/cli.cjs +0 -288600
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -149
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -46
- package/dist/client/createInternalComponents.js +0 -92
- package/dist/client/createModelProxy.d.ts +0 -228
- package/dist/client/createModelProxy.js +0 -818
- package/dist/client/humans.d.ts +0 -48
- package/dist/client/humans.js +0 -52
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -48
- package/dist/client/reactiveEngine.js +0 -910
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -29
- package/dist/context.js +0 -58
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/DatabaseManager.d.ts +0 -105
- package/dist/core/DatabaseManager.js +0 -387
- package/dist/core/QueryProcessor.d.ts +0 -75
- package/dist/core/QueryProcessor.js +0 -255
- package/dist/core/QueryView.d.ts +0 -79
- package/dist/core/QueryView.js +0 -218
- package/dist/core/StoreManager.d.ts +0 -112
- package/dist/core/StoreManager.js +0 -302
- package/dist/core/ViewRegistry.d.ts +0 -20
- package/dist/core/ViewRegistry.js +0 -55
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/core/openIDBWithTimeout.d.ts +0 -65
- package/dist/core/openIDBWithTimeout.js +0 -153
- package/dist/core/queryUtils.d.ts +0 -45
- package/dist/core/queryUtils.js +0 -69
- package/dist/core/storeContract.d.ts +0 -145
- package/dist/core/storeContract.js +0 -12
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -227
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/client.d.ts +0 -61
- package/dist/query/client.js +0 -137
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -230
- package/dist/react/AbloProvider.js +0 -455
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/index.d.ts +0 -61
- package/dist/react/index.js +0 -66
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -75
- package/dist/react/useAblo.js +0 -102
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -129
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -41
- package/dist/schema/index.js +0 -76
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -87
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -262
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -81
- package/dist/source/adapter.js +0 -22
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/footprint.d.ts +0 -111
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/SyncActionStore.d.ts +0 -97
- package/dist/stores/SyncActionStore.js +0 -504
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -280
- package/dist/sync/BootstrapFetcher.js +0 -962
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -228
- package/dist/sync/OnDemandLoader.js +0 -742
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -70
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -113
- package/dist/sync/deltaPipeline.js +0 -261
- package/dist/sync/groupChange.d.ts +0 -113
- package/dist/sync/groupChange.js +0 -242
- package/dist/sync/participants.d.ts +0 -115
- package/dist/sync/participants.js +0 -344
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -70
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- 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/httpResponses.d.ts +0 -70
- package/dist/testing/fixtures/httpResponses.js +0 -90
- 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 -186
- 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 -72
- 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/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -177
- package/dist/transaction/auth/capability.js +0 -199
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -44
- package/dist/transaction/coordination/locator.d.ts +0 -83
- package/dist/transaction/coordination/locator.js +0 -82
- package/dist/transaction/coordination/schema.d.ts +0 -1473
- package/dist/transaction/coordination/schema.js +0 -1013
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -103
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -480
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -192
- package/dist/transaction/plugin.js +0 -87
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -266
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -319
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -85
- package/dist/transaction/resources/where.js +0 -70
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -126
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -57
- package/dist/transaction/schema/openapi.js +0 -340
- package/dist/transaction/schema/relation.d.ts +0 -199
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -324
- package/dist/transaction/schema/schema.js +0 -305
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -123
- package/dist/transaction/transport/httpClient.js +0 -145
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1276
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -576
- package/dist/transaction/transport/wsTransport.js +0 -1017
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -540
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -25
- package/dist/transaction/utils/duration.js +0 -45
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -351
- package/dist/transaction/wire/accountResponses.js +0 -255
- package/dist/transaction/wire/auth.d.ts +0 -49
- package/dist/transaction/wire/auth.js +0 -57
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -463
- package/dist/transaction/wire/claims.js +0 -229
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -177
- package/dist/transaction/wire/feedEvent.js +0 -39
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -552
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -50
- package/dist/transaction/wire/index.js +0 -74
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
- package/dist/transactions/mutations/MutationQueue.js +0 -2797
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -164
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
- package/dist/transactions/mutations/deltaConfirmation.js +0 -233
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -186
- package/dist/transactions/mutations/replayValidation.js +0 -163
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
- package/docs/interaction-model.md +0 -99
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
// Pulled from the endpoints module to keep this schema file free of the client's
|
|
2
|
-
// error-handling and credential dependencies.
|
|
3
|
-
import { ABLO_HOSTED_HTTP_BASE_URL } from '../auth/hostedEndpoints.js';
|
|
4
|
-
// The commit body is DERIVED from the schema the server validates against —
|
|
5
|
-
// one definition site, so the documented surface cannot drift from the
|
|
6
|
-
// enforced one.
|
|
7
|
-
import { z } from 'zod';
|
|
8
|
-
import { commitRequestSchema, commitReceiptSchema } from '../wire/commit.js';
|
|
9
|
-
import { claimRequestSchema, claimHeartbeatRequestSchema, listQuerySchema, claimStateSchema, claimAcquiredResponseSchema, claimQueuedResponseSchema, claimHeartbeatReplySchema, } from '../wire/claims.js';
|
|
10
|
-
import { modelReadResponseSchema, modelListResponseSchema } from '../wire/modelResponses.js';
|
|
11
|
-
import { ephemeralKeyRequestSchema, capabilityRequestSchema } from '../wire/auth.js';
|
|
12
|
-
import { EphemeralKeyResponseSchema } from '../auth/schemas.js';
|
|
13
|
-
function fieldSchema(f) {
|
|
14
|
-
switch (f.type) {
|
|
15
|
-
case 'number':
|
|
16
|
-
return { type: 'number' };
|
|
17
|
-
case 'boolean':
|
|
18
|
-
return { type: 'boolean' };
|
|
19
|
-
case 'date':
|
|
20
|
-
return { type: 'string', format: 'date-time' };
|
|
21
|
-
case 'enum':
|
|
22
|
-
return f.enumValues ? { type: 'string', enum: [...f.enumValues] } : { type: 'string' };
|
|
23
|
-
case 'json':
|
|
24
|
-
return { type: 'object', additionalProperties: true };
|
|
25
|
-
case 'string':
|
|
26
|
-
default:
|
|
27
|
-
return { type: 'string' };
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
const pascal = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
31
|
-
const idParam = () => ({ name: 'id', in: 'path', required: true, schema: { type: 'string' } });
|
|
32
|
-
const jsonBody = (schema) => ({
|
|
33
|
-
required: true,
|
|
34
|
-
content: { 'application/json': { schema } },
|
|
35
|
-
});
|
|
36
|
-
/** For routes where an empty body is meaningful — a bare claim, a plain beat. */
|
|
37
|
-
const optionalJsonBody = (schema) => ({
|
|
38
|
-
required: false,
|
|
39
|
-
content: { 'application/json': { schema } },
|
|
40
|
-
});
|
|
41
|
-
const jsonResp = (description, schema) => ({
|
|
42
|
-
description,
|
|
43
|
-
content: { 'application/json': { schema } },
|
|
44
|
-
});
|
|
45
|
-
/**
|
|
46
|
-
* Derive a JSON Schema from a wire schema.
|
|
47
|
-
*
|
|
48
|
-
* `io` is not optional by accident. A request is what the caller SENDS, so it
|
|
49
|
-
* derives from the input type; a response is what the server RETURNS, so it
|
|
50
|
-
* derives from the output type. Reversing them is silent — the document still
|
|
51
|
-
* looks like a working spec — which is why the direction is stated at every
|
|
52
|
-
* call site rather than defaulted.
|
|
53
|
-
*/
|
|
54
|
-
const derive = (schema, io) => z.toJSONSchema(schema, { io, unrepresentable: 'any' });
|
|
55
|
-
const commitReceipt = () => jsonResp('Commit receipt', derive(commitReceiptSchema, 'output'));
|
|
56
|
-
const modelParam = () => ({
|
|
57
|
-
name: 'model',
|
|
58
|
-
in: 'path',
|
|
59
|
-
required: true,
|
|
60
|
-
schema: { type: 'string' },
|
|
61
|
-
description: 'A model name from your pushed schema, e.g. `task`.',
|
|
62
|
-
});
|
|
63
|
-
const genericRow = () => ({ type: 'object', additionalProperties: true });
|
|
64
|
-
/**
|
|
65
|
-
* Fill in `data` on a derived model-response schema.
|
|
66
|
-
*
|
|
67
|
-
* The wire schemas type a row as `unknown`, because the transport that reads
|
|
68
|
-
* them serves every schema and knows none of them. A reference has the opposite
|
|
69
|
-
* need — a reader wants to see that `data` holds rows — so the envelope is
|
|
70
|
-
* still derived, and only the one deliberately-open field is described. Both
|
|
71
|
-
* shapes of that field are handled: an array for a list, a bare object for a
|
|
72
|
-
* single read.
|
|
73
|
-
*/
|
|
74
|
-
function withGenericRows(derived) {
|
|
75
|
-
const properties = { ...derived.properties };
|
|
76
|
-
if (!('data' in properties))
|
|
77
|
-
return derived;
|
|
78
|
-
properties.data =
|
|
79
|
-
properties.data?.type === 'array'
|
|
80
|
-
? { type: 'array', items: genericRow() }
|
|
81
|
-
: genericRow();
|
|
82
|
-
return { ...derived, properties };
|
|
83
|
-
}
|
|
84
|
-
/** Query parameters derived from the schema the route reads them with. */
|
|
85
|
-
function listQueryParams() {
|
|
86
|
-
const props = (derive(listQuerySchema, 'input').properties ?? {});
|
|
87
|
-
return Object.entries(props).map(([name, schema]) => ({ name, in: 'query', schema }));
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* The `POST /v1/commits` body, derived from {@link commitRequestSchema} — the
|
|
91
|
-
* same schema the server validates the request against.
|
|
92
|
-
*
|
|
93
|
-
* Deriving rather than describing is the point: a hand-written copy of this
|
|
94
|
-
* shape would drift silently, and the tests would pin the copy to itself.
|
|
95
|
-
*/
|
|
96
|
-
const commitBody = () => jsonBody(derive(commitRequestSchema, 'input'));
|
|
97
|
-
/** The envelope shared by both specs — same server, same auth, same version. */
|
|
98
|
-
function envelope(options, description, paths, schemas) {
|
|
99
|
-
return {
|
|
100
|
-
openapi: '3.1.0',
|
|
101
|
-
info: {
|
|
102
|
-
title: options.title ?? 'Ablo API',
|
|
103
|
-
version: options.version ?? '1.0.0',
|
|
104
|
-
description,
|
|
105
|
-
},
|
|
106
|
-
servers: [{ url: options.serverUrl ?? `${ABLO_HOSTED_HTTP_BASE_URL}/api` }],
|
|
107
|
-
security: [{ bearerAuth: [] }],
|
|
108
|
-
components: {
|
|
109
|
-
securitySchemes: {
|
|
110
|
-
bearerAuth: { type: 'http', scheme: 'bearer', description: 'Your Ablo API key (sk_… / rk_…).' },
|
|
111
|
-
},
|
|
112
|
-
schemas,
|
|
113
|
-
},
|
|
114
|
-
paths,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* The protocol reference: the five route templates the server actually serves,
|
|
119
|
-
* plus `/v1/commits`.
|
|
120
|
-
*
|
|
121
|
-
* This takes no schema, and that is the point. The server registers one
|
|
122
|
-
* parameterised route family (`/api/v1/models/:model/...`), so the API is five
|
|
123
|
-
* routes no matter how many models a tenant defines — and a spec that cannot see
|
|
124
|
-
* a schema cannot grow with one. It is publishable once, identical for every
|
|
125
|
-
* caller, and stable across every schema push: the document a Python or Go
|
|
126
|
-
* client is generated from, and the surface an agent is handed.
|
|
127
|
-
*
|
|
128
|
-
* Payload shapes are generic here by design. A caller that wants them typed
|
|
129
|
-
* either reads the schema at runtime or generates the per-tenant expansion with
|
|
130
|
-
* {@link schemaToOpenApi}.
|
|
131
|
-
*/
|
|
132
|
-
export function abloOpenApi(options = {}) {
|
|
133
|
-
const rowResp = jsonResp('The row, with the watermark it was read at and who holds it.', withGenericRows(derive(modelReadResponseSchema, 'output')));
|
|
134
|
-
const writeBody = jsonBody(genericRow());
|
|
135
|
-
const tags = ['models'];
|
|
136
|
-
const paths = {
|
|
137
|
-
'/v1/models/{model}': {
|
|
138
|
-
get: {
|
|
139
|
-
tags,
|
|
140
|
-
summary: 'List rows of a model',
|
|
141
|
-
parameters: [modelParam(), ...listQueryParams()],
|
|
142
|
-
responses: {
|
|
143
|
-
'200': jsonResp('A page of rows. `next_cursor` feeds `starting_after` on the next ' +
|
|
144
|
-
'call; `stamp` is the watermark the page was read at.', withGenericRows(derive(modelListResponseSchema, 'output'))),
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
post: { tags, summary: 'Create a row', parameters: [modelParam()], requestBody: writeBody, responses: { '200': commitReceipt() } },
|
|
148
|
-
},
|
|
149
|
-
'/v1/models/{model}/{id}': {
|
|
150
|
-
get: { tags, summary: 'Retrieve a row', parameters: [modelParam(), idParam()], responses: { '200': rowResp } },
|
|
151
|
-
patch: { tags, summary: 'Update a row', parameters: [modelParam(), idParam()], requestBody: writeBody, responses: { '200': commitReceipt() } },
|
|
152
|
-
delete: { tags, summary: 'Delete a row', parameters: [modelParam(), idParam()], responses: { '200': commitReceipt() } },
|
|
153
|
-
},
|
|
154
|
-
'/v1/models/{model}/{id}/claim': {
|
|
155
|
-
post: {
|
|
156
|
-
tags: ['claims'],
|
|
157
|
-
summary: 'Claim a row (acquire lease)',
|
|
158
|
-
parameters: [modelParam(), idParam()],
|
|
159
|
-
requestBody: optionalJsonBody(derive(claimRequestSchema, 'input')),
|
|
160
|
-
responses: {
|
|
161
|
-
'201': jsonResp('The lease is yours. `claim.fenceToken` is set when the coordinator ' +
|
|
162
|
-
'minted one; carry it on writes made under the lease.', derive(claimAcquiredResponseSchema, 'output')),
|
|
163
|
-
'202': jsonResp('The row was already held and you asked to queue. You are in line at ' +
|
|
164
|
-
'`position` — heartbeat to keep the slot, and poll ' +
|
|
165
|
-
'`GET /v1/claims/{claimId}` for the grant.', derive(claimQueuedResponseSchema, 'output')),
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
delete: { tags: ['claims'], summary: 'Release a claim', parameters: [modelParam(), idParam()], responses: { '200': jsonResp('Released', { type: 'object' }) } },
|
|
169
|
-
},
|
|
170
|
-
'/v1/models/{model}/{id}/claim/heartbeat': {
|
|
171
|
-
post: {
|
|
172
|
-
tags: ['claims'],
|
|
173
|
-
summary: 'Heartbeat a held claim (extend the lease for long-running work)',
|
|
174
|
-
parameters: [modelParam(), idParam()],
|
|
175
|
-
requestBody: optionalJsonBody(derive(claimHeartbeatRequestSchema, 'input')),
|
|
176
|
-
responses: {
|
|
177
|
-
'200': jsonResp('Lease extended (or queued slot refreshed)', derive(claimHeartbeatReplySchema, 'output')),
|
|
178
|
-
},
|
|
179
|
-
},
|
|
180
|
-
},
|
|
181
|
-
'/v1/models/{model}/{id}/claim/reorder': {
|
|
182
|
-
post: { tags: ['claims'], summary: 'Reorder the wait-line (privileged)', parameters: [modelParam(), idParam()], responses: { '200': jsonResp('Reordered', { type: 'object' }) } },
|
|
183
|
-
},
|
|
184
|
-
'/v1/ephemeral_keys': {
|
|
185
|
-
post: {
|
|
186
|
-
tags: ['credentials'],
|
|
187
|
-
summary: 'Mint a short-lived session credential',
|
|
188
|
-
description: 'Call this first: every other route needs the key it returns. Requires a ' +
|
|
189
|
-
'secret (`sk_`) key — a session cannot mint itself.',
|
|
190
|
-
parameters: [
|
|
191
|
-
{ name: 'Idempotency-Key', in: 'header', schema: { type: 'string' }, description: 'Replay-safe key; the server returns the cached credential on retry.' },
|
|
192
|
-
],
|
|
193
|
-
requestBody: jsonBody(derive(ephemeralKeyRequestSchema, 'input')),
|
|
194
|
-
responses: { '200': jsonResp('The minted credential', derive(EphemeralKeyResponseSchema, 'output')) },
|
|
195
|
-
},
|
|
196
|
-
},
|
|
197
|
-
'/v1/claims/{claimId}': {
|
|
198
|
-
get: {
|
|
199
|
-
tags: ['claims'],
|
|
200
|
-
summary: 'Poll a claim for its current state',
|
|
201
|
-
description: 'How a caller without a persistent connection learns its queued claim ' +
|
|
202
|
-
'was granted. `position` is advisory — a privileged reorder can move it ' +
|
|
203
|
-
'up — so branch on `status`, never on position.',
|
|
204
|
-
parameters: [{ name: 'claimId', in: 'path', required: true, schema: { type: 'string' } }],
|
|
205
|
-
responses: { '200': jsonResp('The claim state', derive(claimStateSchema, 'output')) },
|
|
206
|
-
},
|
|
207
|
-
delete: {
|
|
208
|
-
tags: ['claims'],
|
|
209
|
-
summary: 'Release a claim, or leave the wait line',
|
|
210
|
-
description: 'The same call for both: releasing a held lease and abandoning a queued ' +
|
|
211
|
-
'position are one operation, because a queue entry is a lease in a ' +
|
|
212
|
-
'different state.',
|
|
213
|
-
parameters: [{ name: 'claimId', in: 'path', required: true, schema: { type: 'string' } }],
|
|
214
|
-
responses: { '200': jsonResp('Released', { type: 'object' }) },
|
|
215
|
-
},
|
|
216
|
-
},
|
|
217
|
-
'/v1/capabilities': {
|
|
218
|
-
post: {
|
|
219
|
-
tags: ['credentials'],
|
|
220
|
-
summary: 'Mint a capability for an agent or system',
|
|
221
|
-
description: 'A scoped, revocable grant. Narrow by default: an agent or system ' +
|
|
222
|
-
'capability must name its `syncGroups` and `operations`.',
|
|
223
|
-
requestBody: jsonBody(derive(capabilityRequestSchema, 'input')),
|
|
224
|
-
responses: { '200': jsonResp('The minted capability', { type: 'object' }) },
|
|
225
|
-
},
|
|
226
|
-
},
|
|
227
|
-
'/v1/capabilities/{id}': {
|
|
228
|
-
get: {
|
|
229
|
-
tags: ['credentials'],
|
|
230
|
-
summary: 'Inspect a capability',
|
|
231
|
-
parameters: [idParam()],
|
|
232
|
-
responses: { '200': jsonResp('The capability', { type: 'object' }) },
|
|
233
|
-
},
|
|
234
|
-
delete: {
|
|
235
|
-
tags: ['credentials'],
|
|
236
|
-
summary: 'Revoke a capability',
|
|
237
|
-
parameters: [idParam()],
|
|
238
|
-
responses: { '200': jsonResp('Revoked', { type: 'object' }) },
|
|
239
|
-
},
|
|
240
|
-
},
|
|
241
|
-
'/v1/capabilities/{id}/rotate': {
|
|
242
|
-
post: {
|
|
243
|
-
tags: ['credentials'],
|
|
244
|
-
summary: 'Rotate a capability, keeping its grant',
|
|
245
|
-
parameters: [idParam()],
|
|
246
|
-
responses: { '200': jsonResp('The rotated capability', { type: 'object' }) },
|
|
247
|
-
},
|
|
248
|
-
},
|
|
249
|
-
'/v1/commits': {
|
|
250
|
-
post: {
|
|
251
|
-
tags: ['commits'],
|
|
252
|
-
summary: 'Commit a batch of operations atomically, and/or register durable premises',
|
|
253
|
-
parameters: [{ name: 'Idempotency-Key', in: 'header', schema: { type: 'string' }, description: 'Replay-safe key; the server returns the cached receipt on retry.' }],
|
|
254
|
-
requestBody: commitBody(),
|
|
255
|
-
responses: { '200': commitReceipt() },
|
|
256
|
-
},
|
|
257
|
-
},
|
|
258
|
-
};
|
|
259
|
-
return envelope(options, 'The Ablo transaction layer: commit, read, and claim. `{model}` is any model ' +
|
|
260
|
-
'from your pushed schema — the routes are the same whichever it is. ' +
|
|
261
|
-
'Authenticate every request with your API key as a Bearer token.', paths, {});
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* The per-tenant expansion: every model's routes written out with typed payloads.
|
|
265
|
-
*
|
|
266
|
-
* Useful when you want generated types for one schema — five paths per model, so
|
|
267
|
-
* it grows with the schema and is regenerated on every push. It documents the
|
|
268
|
-
* same five routes {@link abloOpenApi} describes; it does not describe a
|
|
269
|
-
* different API.
|
|
270
|
-
*/
|
|
271
|
-
export function schemaToOpenApi(schema, options = {}) {
|
|
272
|
-
const models = schema.models;
|
|
273
|
-
const paths = {};
|
|
274
|
-
const schemas = {};
|
|
275
|
-
for (const [key, def] of Object.entries(models)) {
|
|
276
|
-
const ref = { $ref: `#/components/schemas/${pascal(key)}` };
|
|
277
|
-
const properties = { id: { type: 'string' } };
|
|
278
|
-
const required = ['id'];
|
|
279
|
-
const createProps = {};
|
|
280
|
-
for (const [fname, fmeta] of Object.entries(def.fields)) {
|
|
281
|
-
const fs = fieldSchema(fmeta);
|
|
282
|
-
properties[fname] = fs;
|
|
283
|
-
createProps[fname] = fs;
|
|
284
|
-
if (!fmeta.isOptional)
|
|
285
|
-
required.push(fname);
|
|
286
|
-
}
|
|
287
|
-
schemas[pascal(key)] = { type: 'object', properties, required };
|
|
288
|
-
const createBody = jsonBody({ type: 'object', properties: createProps });
|
|
289
|
-
paths[`/v1/models/${key}`] = {
|
|
290
|
-
get: {
|
|
291
|
-
tags: [key],
|
|
292
|
-
summary: `List ${key}`,
|
|
293
|
-
parameters: listQueryParams(),
|
|
294
|
-
responses: {
|
|
295
|
-
'200': jsonResp('List of rows', {
|
|
296
|
-
type: 'object',
|
|
297
|
-
properties: { object: { type: 'string', enum: ['list'] }, data: { type: 'array', items: ref } },
|
|
298
|
-
}),
|
|
299
|
-
},
|
|
300
|
-
},
|
|
301
|
-
post: { tags: [key], summary: `Create a ${key}`, requestBody: createBody, responses: { '200': commitReceipt() } },
|
|
302
|
-
};
|
|
303
|
-
paths[`/v1/models/${key}/{id}`] = {
|
|
304
|
-
get: {
|
|
305
|
-
tags: [key],
|
|
306
|
-
summary: `Retrieve a ${key}`,
|
|
307
|
-
parameters: [idParam()],
|
|
308
|
-
responses: {
|
|
309
|
-
'200': jsonResp('The row', {
|
|
310
|
-
type: 'object',
|
|
311
|
-
properties: { data: ref, stamp: { type: 'integer' } },
|
|
312
|
-
}),
|
|
313
|
-
},
|
|
314
|
-
},
|
|
315
|
-
patch: { tags: [key], summary: `Update a ${key}`, parameters: [idParam()], requestBody: createBody, responses: { '200': commitReceipt() } },
|
|
316
|
-
delete: { tags: [key], summary: `Delete a ${key}`, parameters: [idParam()], responses: { '200': commitReceipt() } },
|
|
317
|
-
};
|
|
318
|
-
paths[`/v1/models/${key}/{id}/claim`] = {
|
|
319
|
-
post: { tags: [key], summary: `Claim a ${key} (acquire lease)`, parameters: [idParam()], responses: { '200': jsonResp('Claim acquired', { type: 'object' }) } },
|
|
320
|
-
delete: { tags: [key], summary: `Release a ${key} claim`, parameters: [idParam()], responses: { '200': jsonResp('Released', { type: 'object' }) } },
|
|
321
|
-
};
|
|
322
|
-
paths[`/v1/models/${key}/{id}/claim/heartbeat`] = {
|
|
323
|
-
post: { tags: [key], summary: `Heartbeat a held ${key} claim (extend the lease for long-running work)`, parameters: [idParam()], responses: { '200': jsonResp('Lease extended (or queued slot refreshed)', derive(claimHeartbeatReplySchema, 'output')) } },
|
|
324
|
-
};
|
|
325
|
-
paths[`/v1/models/${key}/{id}/claim/reorder`] = {
|
|
326
|
-
post: { tags: [key], summary: `Reorder the ${key} wait-line (privileged)`, parameters: [idParam()], responses: { '200': jsonResp('Reordered', { type: 'object' }) } },
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
paths['/v1/commits'] = {
|
|
330
|
-
post: {
|
|
331
|
-
tags: ['commits'],
|
|
332
|
-
summary: 'Commit a batch of operations atomically, and/or register durable premises',
|
|
333
|
-
parameters: [{ name: 'Idempotency-Key', in: 'header', schema: { type: 'string' }, description: 'Replay-safe key; the server returns the cached receipt on retry.' }],
|
|
334
|
-
requestBody: commitBody(),
|
|
335
|
-
responses: { '200': commitReceipt() },
|
|
336
|
-
},
|
|
337
|
-
};
|
|
338
|
-
return envelope(options, 'Generated from your pushed Ablo schema — these routes are your models. ' +
|
|
339
|
-
'Authenticate every request with your API key as a Bearer token.', paths, schemas);
|
|
340
|
-
}
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Declarative relations between your models — the edges that turn a flat set
|
|
3
|
-
* of models into a graph. You attach relations to a model with the
|
|
4
|
-
* {@link relation} factories; the engine reads them to index foreign keys for
|
|
5
|
-
* fast child lookups, to order inserts so a parent row lands before the rows
|
|
6
|
-
* that reference it, and to generate the accessor properties that let you read
|
|
7
|
-
* `task.project` or `project.tasks` directly.
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* import { relation } from '@abloatai/ablo/schema';
|
|
11
|
-
*
|
|
12
|
-
* const taskRelations = {
|
|
13
|
-
* project: relation.belongsTo('projects', 'projectId'),
|
|
14
|
-
* assignee: relation.belongsTo('users', 'assigneeId'),
|
|
15
|
-
* comments: relation.hasMany('comments', 'taskId'),
|
|
16
|
-
* };
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Options for `relation.belongsTo`. Each defaults to `false`, so every
|
|
20
|
-
* behavior below is opt-in per relation.
|
|
21
|
-
*
|
|
22
|
-
* `index: true` registers a foreign-key index for the child model when the
|
|
23
|
-
* engine starts, turning "every child that points at this parent" from a full
|
|
24
|
-
* scan into a constant-time lookup. Reach for it on relations you query this
|
|
25
|
-
* way often, such as a block's `sectionId`.
|
|
26
|
-
*
|
|
27
|
-
* `enrich: true` auto-populates the parent reference on an incoming change
|
|
28
|
-
* before the child data lands. A change to `Task { teamId: 't1' }` picks up the
|
|
29
|
-
* already-loaded `teams:t1` record and attaches it as `data.team`, so you can
|
|
30
|
-
* read `task.team` without a second lookup. Enrichment is best-effort: if the
|
|
31
|
-
* parent has not loaded yet it quietly does nothing, and the child data still
|
|
32
|
-
* applies.
|
|
33
|
-
*
|
|
34
|
-
* `defer: true` tells the engine to ignore this edge when it works out the
|
|
35
|
-
* order in which to insert rows. Use it on the soft side of a genuine reference
|
|
36
|
-
* cycle — the side where you are willing to insert the child first with the
|
|
37
|
-
* foreign key left null and fill it in with a later update. The other side of
|
|
38
|
-
* the cycle then becomes a strict predecessor, so the child is ordered after
|
|
39
|
-
* the parent rather than tied with it.
|
|
40
|
-
*
|
|
41
|
-
* `defer` changes only that ordering, not what the engine sends on the wire; it
|
|
42
|
-
* does not rewrite an insert into an insert-then-update. Pair it with a Postgres
|
|
43
|
-
* `DEFERRABLE INITIALLY DEFERRED` constraint when you also want the database to
|
|
44
|
-
* relax the foreign-key check itself. For example:
|
|
45
|
-
*
|
|
46
|
-
* ```ts
|
|
47
|
-
* layouts: model({ reportId: z.string().nullish() }, {
|
|
48
|
-
* // The report-owns-layout link is nullable and the layout is always
|
|
49
|
-
* // created first; marking it `defer` lets the report commit ahead of the
|
|
50
|
-
* // layout instead of sharing its insert-order slot.
|
|
51
|
-
* report: relation.belongsTo('reports', 'reportId', { defer: true }),
|
|
52
|
-
* }),
|
|
53
|
-
* ```
|
|
54
|
-
*/
|
|
55
|
-
export interface BelongsToOptions {
|
|
56
|
-
readonly index?: boolean;
|
|
57
|
-
readonly enrich?: boolean;
|
|
58
|
-
readonly defer?: boolean;
|
|
59
|
-
/**
|
|
60
|
-
* Marks the relation's target as this record's parent: the entity the record
|
|
61
|
-
* lives inside and inherits its access scope from. When a record is written,
|
|
62
|
-
* the engine routes it into its parent's sync group — following a chain of
|
|
63
|
-
* `parent` edges all the way up — so the change reaches everyone subscribed to
|
|
64
|
-
* the owning entity. This is the familiar rule that access flows down from a
|
|
65
|
-
* container to the things it holds, as a folder does to its files.
|
|
66
|
-
*
|
|
67
|
-
* Do not set `parent` on a reference that merely points at another record for
|
|
68
|
-
* provenance or as a template, such as `sourceSectionId` or `templateId`; doing
|
|
69
|
-
* so would leak the record into an unrelated scope. The engine also cannot
|
|
70
|
-
* infer the parent from whether a field is optional — many real parent keys
|
|
71
|
-
* are optional, like a root folder or an inbox task — so you must declare the
|
|
72
|
-
* parent edge explicitly.
|
|
73
|
-
*
|
|
74
|
-
* It reads naturally at the call site:
|
|
75
|
-
* `belongsTo('report', 'reportId', { parent: true })` — the report is the parent.
|
|
76
|
-
*/
|
|
77
|
-
readonly parent?: boolean;
|
|
78
|
-
/**
|
|
79
|
-
* Emit a real Postgres foreign-key constraint for this relation when the
|
|
80
|
-
* engine provisions tables in a customer-owned database. This is independent
|
|
81
|
-
* of `parent`: `parent` decides which subscribers a change reaches, while
|
|
82
|
-
* `fk` decides whether the database enforces referential integrity. A relation
|
|
83
|
-
* may set either, both, or neither.
|
|
84
|
-
*
|
|
85
|
-
* Set `fk: true` only when the target row lives in the same database and is
|
|
86
|
-
* written in the same commit as this row, and points at a strong, contained
|
|
87
|
-
* entity. Leave it off provenance or template pointers (`sourceSectionId`,
|
|
88
|
-
* `templateId`), cross-tenant references, or anything that may be written in a
|
|
89
|
-
* different transaction than its target — a hard constraint there would reject
|
|
90
|
-
* the write and break out-of-order sync. The constraint is emitted as
|
|
91
|
-
* `DEFERRABLE INITIALLY DEFERRED, ON DELETE NO ACTION`: a plain integrity
|
|
92
|
-
* guard, leaving any cascade or null-on-delete behavior to the application.
|
|
93
|
-
*/
|
|
94
|
-
readonly fk?: boolean;
|
|
95
|
-
}
|
|
96
|
-
declare const __relationType: unique symbol;
|
|
97
|
-
declare const __relationTarget: unique symbol;
|
|
98
|
-
declare const __relationField: unique symbol;
|
|
99
|
-
export type RelationType = 'belongsTo' | 'hasMany' | 'hasOne';
|
|
100
|
-
/**
|
|
101
|
-
* A relation definition, carrying its type information at both the type and
|
|
102
|
-
* runtime level.
|
|
103
|
-
*
|
|
104
|
-
* The `Options` generic captures a relation's options in the type system; only
|
|
105
|
-
* `belongsTo` uses it, while `hasMany` and `hasOne` leave it empty. The `const`
|
|
106
|
-
* modifier on the `belongsTo` factory preserves literal inference, so
|
|
107
|
-
* `{ enrich: true }` is remembered as `true` rather than widened to `boolean`,
|
|
108
|
-
* letting type-level features read the exact option value.
|
|
109
|
-
*
|
|
110
|
-
* `options` is always present at runtime: the factory substitutes an empty
|
|
111
|
-
* object when you omit it, so reading `options.index` or `options.enrich` needs
|
|
112
|
-
* no null check.
|
|
113
|
-
*/
|
|
114
|
-
export interface RelationDef<Type extends RelationType = RelationType, Target extends string = string, Field extends string = string, Options extends BelongsToOptions = BelongsToOptions> {
|
|
115
|
-
readonly [__relationType]: Type;
|
|
116
|
-
readonly [__relationTarget]: Target;
|
|
117
|
-
readonly [__relationField]: Field;
|
|
118
|
-
/** Runtime metadata */
|
|
119
|
-
readonly type: Type;
|
|
120
|
-
readonly target: Target;
|
|
121
|
-
/**
|
|
122
|
-
* The field on the child model that holds the parent's id, as a camelCase
|
|
123
|
-
* schema field name. The engine reads `model[foreignKey]` to resolve the
|
|
124
|
-
* relation and to build client-side index keys; it is never interpolated into
|
|
125
|
-
* raw SQL — that is what {@link foreignKeyColumn} is for.
|
|
126
|
-
*/
|
|
127
|
-
readonly foreignKey: Field;
|
|
128
|
-
/**
|
|
129
|
-
* The same foreign key expressed as a database column identifier.
|
|
130
|
-
* {@link foreignKey} is translated into this when you configure a `casing`
|
|
131
|
-
* option on `defineSchema` — for example `'snake_case'` turns `messageId`
|
|
132
|
-
* into `message_id`. The server interpolates this column name into SQL
|
|
133
|
-
* directly, because a driver's automatic camelCase-to-snake_case mapping does
|
|
134
|
-
* not reach identifiers embedded in raw SQL; resolving the name once at
|
|
135
|
-
* schema-build time is what makes it available there.
|
|
136
|
-
*
|
|
137
|
-
* Defaults to {@link foreignKey} when no `casing` option is set, so consumers
|
|
138
|
-
* whose database columns already match their field names need no
|
|
139
|
-
* configuration.
|
|
140
|
-
*/
|
|
141
|
-
readonly foreignKeyColumn: string;
|
|
142
|
-
readonly options: Options;
|
|
143
|
-
/**
|
|
144
|
-
* Optional sort field for `hasMany` relations. When set, the
|
|
145
|
-
* generated relation getter sorts results by this field. Populated
|
|
146
|
-
* by `relation.hasMany(target, fk, { orderBy: 'fieldName' })`.
|
|
147
|
-
*/
|
|
148
|
-
readonly _orderBy?: string;
|
|
149
|
-
}
|
|
150
|
-
export declare const relation: {
|
|
151
|
-
/**
|
|
152
|
-
* This model belongs to another model via a foreign key.
|
|
153
|
-
* e.g., Task belongs to Project via projectId
|
|
154
|
-
*
|
|
155
|
-
* ```ts
|
|
156
|
-
* // Simple reference (no options)
|
|
157
|
-
* project: relation.belongsTo('projects', 'projectId'),
|
|
158
|
-
*
|
|
159
|
-
* // Register an FK index for O(1) child lookups
|
|
160
|
-
* section: relation.belongsTo('sections', 'sectionId', { index: true }),
|
|
161
|
-
*
|
|
162
|
-
* // Auto-populate the parent on delta arrival
|
|
163
|
-
* team: relation.belongsTo('teams', 'teamId', { enrich: true }),
|
|
164
|
-
*
|
|
165
|
-
* // Both
|
|
166
|
-
* parent: relation.belongsTo('threads', 'parentId', { index: true, enrich: true }),
|
|
167
|
-
*
|
|
168
|
-
* // Mark the soft side of a cycle so the priority computer breaks
|
|
169
|
-
* // the cycle deterministically instead of tying the two models.
|
|
170
|
-
* report: relation.belongsTo('reports', 'reportId', { defer: true }),
|
|
171
|
-
* ```
|
|
172
|
-
*/
|
|
173
|
-
readonly belongsTo: <Target extends string, Field extends string, const Opts extends BelongsToOptions = Record<string, never>>(target: Target, foreignKey: Field, options?: Opts) => RelationDef<"belongsTo", Target, Field, Opts>;
|
|
174
|
-
/**
|
|
175
|
-
* This model has many of another model — for example, a project has many
|
|
176
|
-
* tasks via `Task.projectId`.
|
|
177
|
-
*
|
|
178
|
-
* At runtime the engine adds a getter to the parent model that returns every
|
|
179
|
-
* child whose foreign key matches, and registers the foreign-key index on the
|
|
180
|
-
* child model automatically.
|
|
181
|
-
*
|
|
182
|
-
* ```ts
|
|
183
|
-
* blocks: relation.hasMany('blocks', 'sectionId'),
|
|
184
|
-
* // → section.blocks returns all Block[] where sectionId === section.id
|
|
185
|
-
*
|
|
186
|
-
* blocks: relation.hasMany('blocks', 'sectionId', { orderBy: 'zIndex' }),
|
|
187
|
-
* // → section.blocks returns Block[] sorted by zIndex ascending
|
|
188
|
-
* ```
|
|
189
|
-
*/
|
|
190
|
-
readonly hasMany: <Target extends string, Field extends string>(target: Target, foreignKey: Field, options?: {
|
|
191
|
-
orderBy?: string;
|
|
192
|
-
}) => RelationDef<"hasMany", Target, Field>;
|
|
193
|
-
/**
|
|
194
|
-
* This model has one of another model — for example, a user has one profile
|
|
195
|
-
* via `Profile.userId`.
|
|
196
|
-
*/
|
|
197
|
-
readonly hasOne: <Target extends string, Field extends string>(target: Target, foreignKey: Field) => RelationDef<"hasOne", Target, Field>;
|
|
198
|
-
};
|
|
199
|
-
export {};
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Declarative relations between your models — the edges that turn a flat set
|
|
3
|
-
* of models into a graph. You attach relations to a model with the
|
|
4
|
-
* {@link relation} factories; the engine reads them to index foreign keys for
|
|
5
|
-
* fast child lookups, to order inserts so a parent row lands before the rows
|
|
6
|
-
* that reference it, and to generate the accessor properties that let you read
|
|
7
|
-
* `task.project` or `project.tasks` directly.
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* import { relation } from '@abloatai/ablo/schema';
|
|
11
|
-
*
|
|
12
|
-
* const taskRelations = {
|
|
13
|
-
* project: relation.belongsTo('projects', 'projectId'),
|
|
14
|
-
* assignee: relation.belongsTo('users', 'assigneeId'),
|
|
15
|
-
* comments: relation.hasMany('comments', 'taskId'),
|
|
16
|
-
* };
|
|
17
|
-
*/
|
|
18
|
-
// ── Internal relation builder ─────────────────────────────────────────────
|
|
19
|
-
class RelationBuilder {
|
|
20
|
-
type;
|
|
21
|
-
target;
|
|
22
|
-
foreignKey;
|
|
23
|
-
/**
|
|
24
|
-
* Starts out identical to {@link foreignKey}. `defineSchema` overwrites
|
|
25
|
-
* this when a `casing` option is set — it's declared as a mutable
|
|
26
|
-
* (non-readonly on the implementation side) so the schema builder can
|
|
27
|
-
* resolve it once at build time without allocating a new object per
|
|
28
|
-
* relation. Consumers see it typed as `readonly` on {@link RelationDef}.
|
|
29
|
-
*/
|
|
30
|
-
foreignKeyColumn;
|
|
31
|
-
options;
|
|
32
|
-
/**
|
|
33
|
-
* Stashed by `hasMany` when the caller provides `{ orderBy }`. Read
|
|
34
|
-
* back in `createSyncEngine` to install the sort comparator on the
|
|
35
|
-
* generated relation getter. Declared on the builder so both writer
|
|
36
|
-
* and reader stay type-safe — no double-cast smuggle through `Record<...>`.
|
|
37
|
-
*/
|
|
38
|
-
_orderBy;
|
|
39
|
-
constructor(type, target, foreignKey, options) {
|
|
40
|
-
this.type = type;
|
|
41
|
-
this.target = target;
|
|
42
|
-
this.foreignKey = foreignKey;
|
|
43
|
-
this.foreignKeyColumn = foreignKey;
|
|
44
|
-
this.options = (options ?? {});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
// ── Public relation factories ─────────────────────────────────────────────
|
|
48
|
-
export const relation = {
|
|
49
|
-
/**
|
|
50
|
-
* This model belongs to another model via a foreign key.
|
|
51
|
-
* e.g., Task belongs to Project via projectId
|
|
52
|
-
*
|
|
53
|
-
* ```ts
|
|
54
|
-
* // Simple reference (no options)
|
|
55
|
-
* project: relation.belongsTo('projects', 'projectId'),
|
|
56
|
-
*
|
|
57
|
-
* // Register an FK index for O(1) child lookups
|
|
58
|
-
* section: relation.belongsTo('sections', 'sectionId', { index: true }),
|
|
59
|
-
*
|
|
60
|
-
* // Auto-populate the parent on delta arrival
|
|
61
|
-
* team: relation.belongsTo('teams', 'teamId', { enrich: true }),
|
|
62
|
-
*
|
|
63
|
-
* // Both
|
|
64
|
-
* parent: relation.belongsTo('threads', 'parentId', { index: true, enrich: true }),
|
|
65
|
-
*
|
|
66
|
-
* // Mark the soft side of a cycle so the priority computer breaks
|
|
67
|
-
* // the cycle deterministically instead of tying the two models.
|
|
68
|
-
* report: relation.belongsTo('reports', 'reportId', { defer: true }),
|
|
69
|
-
* ```
|
|
70
|
-
*/
|
|
71
|
-
belongsTo(target, foreignKey, options) {
|
|
72
|
-
return new RelationBuilder('belongsTo', target, foreignKey, options ?? {});
|
|
73
|
-
},
|
|
74
|
-
/**
|
|
75
|
-
* This model has many of another model — for example, a project has many
|
|
76
|
-
* tasks via `Task.projectId`.
|
|
77
|
-
*
|
|
78
|
-
* At runtime the engine adds a getter to the parent model that returns every
|
|
79
|
-
* child whose foreign key matches, and registers the foreign-key index on the
|
|
80
|
-
* child model automatically.
|
|
81
|
-
*
|
|
82
|
-
* ```ts
|
|
83
|
-
* blocks: relation.hasMany('blocks', 'sectionId'),
|
|
84
|
-
* // → section.blocks returns all Block[] where sectionId === section.id
|
|
85
|
-
*
|
|
86
|
-
* blocks: relation.hasMany('blocks', 'sectionId', { orderBy: 'zIndex' }),
|
|
87
|
-
* // → section.blocks returns Block[] sorted by zIndex ascending
|
|
88
|
-
* ```
|
|
89
|
-
*/
|
|
90
|
-
hasMany(target, foreignKey, options) {
|
|
91
|
-
const builder = new RelationBuilder('hasMany', target, foreignKey);
|
|
92
|
-
if (options?.orderBy) {
|
|
93
|
-
builder._orderBy = options.orderBy;
|
|
94
|
-
}
|
|
95
|
-
return builder;
|
|
96
|
-
},
|
|
97
|
-
/**
|
|
98
|
-
* This model has one of another model — for example, a user has one profile
|
|
99
|
-
* via `Profile.userId`.
|
|
100
|
-
*/
|
|
101
|
-
hasOne(target, foreignKey) {
|
|
102
|
-
return new RelationBuilder('hasOne', target, foreignKey);
|
|
103
|
-
},
|
|
104
|
-
};
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A model's residency: which database its rows live in. This is a sibling axis
|
|
3
|
-
* to `tenancy`, which instead describes how rows are isolated within a single
|
|
4
|
-
* database.
|
|
5
|
-
*
|
|
6
|
-
* - `tenant` — the tenant data plane. For a customer-connected database this
|
|
7
|
-
* is the customer's own database, and provisioning creates these
|
|
8
|
-
* tables there.
|
|
9
|
-
* - `control` — the coordination plane the engine owns: the change log,
|
|
10
|
-
* attribution, audit, and the like. These tables are never
|
|
11
|
-
* created in a customer's database.
|
|
12
|
-
*
|
|
13
|
-
* The name is `residency` rather than `plane` because "plane" already refers to
|
|
14
|
-
* the server's tenancy scope — organization, environment, and optionally
|
|
15
|
-
* project and sandbox. On the wire the serialized option is still keyed as
|
|
16
|
-
* `plane`, a frozen part of the wire format; only the TypeScript name differs.
|
|
17
|
-
*
|
|
18
|
-
* Declaring this boundary lets provisioning derive what a customer's database
|
|
19
|
-
* receives — the models whose residency is `tenant` — rather than hand-coding
|
|
20
|
-
* that list. Defaults to `tenant`.
|
|
21
|
-
*/
|
|
22
|
-
import { z } from 'zod';
|
|
23
|
-
export declare const residencySchema: z.ZodEnum<{
|
|
24
|
-
tenant: "tenant";
|
|
25
|
-
control: "control";
|
|
26
|
-
}>;
|
|
27
|
-
export type ModelResidency = z.infer<typeof residencySchema>;
|
|
28
|
-
/** Default residency for a model that doesn't declare one — the tenant data plane. */
|
|
29
|
-
export declare const DEFAULT_RESIDENCY: ModelResidency;
|