@abloatai/ablo 0.36.0 → 0.37.1
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 +55 -2014
- package/NOTICE +2 -2
- package/README.md +45 -63
- 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 -114
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -163
- 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 +1 -1
- package/docs/api-keys.md +7 -6
- package/docs/api.md +10 -10
- package/docs/client-behavior.md +5 -5
- package/docs/coordination.md +52 -62
- package/docs/data-sources.md +1 -1
- 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/server-agent.md +2 -2
- package/docs/how-it-works.md +4 -4
- package/docs/identity.md +2 -1
- package/docs/integration-guide.md +24 -13
- 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 +2 -2
- package/docs/migration.md +3 -3
- package/docs/quickstart.md +2 -2
- package/docs/react.md +5 -5
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- 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 +8 -8
- package/package.json +63 -166
- package/bin/ablo.cjs +0 -39
- package/dist/BaseSyncedStore.d.ts +0 -843
- package/dist/BaseSyncedStore.js +0 -1971
- package/dist/Database.d.ts +0 -323
- package/dist/Database.js +0 -1502
- package/dist/InstanceCache.d.ts +0 -237
- package/dist/InstanceCache.js +0 -1166
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -454
- package/dist/Model.js +0 -919
- package/dist/ModelRegistry.d.ts +0 -225
- package/dist/ModelRegistry.js +0 -539
- package/dist/NetworkMonitor.d.ts +0 -28
- package/dist/NetworkMonitor.js +0 -79
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -541
- package/dist/SyncClient.js +0 -2202
- 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/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -160
- 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 -50
- package/dist/client/createInternalComponents.js +0 -98
- package/dist/client/createModelProxy.d.ts +0 -248
- package/dist/client/createModelProxy.js +0 -884
- package/dist/client/humans.d.ts +0 -69
- package/dist/client/humans.js +0 -78
- 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 -53
- package/dist/client/reactiveEngine.js +0 -688
- 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/storeCluster.d.ts +0 -47
- package/dist/client/storeCluster.js +0 -118
- package/dist/client/storeLifecycle.d.ts +0 -61
- package/dist/client/storeLifecycle.js +0 -231
- 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 -42
- package/dist/context.js +0 -81
- 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/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -230
- 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/QueryProcessor.d.ts +0 -75
- package/dist/query/QueryProcessor.js +0 -255
- package/dist/query/client.d.ts +0 -64
- package/dist/query/client.js +0 -138
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -242
- package/dist/react/AbloProvider.js +0 -458
- 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/createAbloReact.d.ts +0 -56
- package/dist/react/createAbloReact.js +0 -51
- package/dist/react/index.d.ts +0 -62
- package/dist/react/index.js +0 -69
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -82
- package/dist/react/useAblo.js +0 -120
- 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 -133
- 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 -42
- package/dist/schema/index.js +0 -80
- 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 -90
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -265
- 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 -83
- package/dist/source/adapter.js +0 -24
- 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/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/storeContract.d.ts +0 -145
- package/dist/storeContract.js +0 -12
- package/dist/stores/DatabaseManager.d.ts +0 -107
- package/dist/stores/DatabaseManager.js +0 -388
- 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/StoreManager.d.ts +0 -114
- package/dist/stores/StoreManager.js +0 -304
- package/dist/stores/SyncActionStore.d.ts +0 -99
- package/dist/stores/SyncActionStore.js +0 -506
- package/dist/stores/openIDBWithTimeout.d.ts +0 -65
- package/dist/stores/openIDBWithTimeout.js +0 -153
- 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 -284
- package/dist/sync/BootstrapFetcher.js +0 -964
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -231
- package/dist/sync/OnDemandLoader.js +0 -743
- 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 -73
- 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 -114
- package/dist/sync/deltaPipeline.js +0 -278
- package/dist/sync/groupChange.d.ts +0 -116
- package/dist/sync/groupChange.js +0 -244
- package/dist/sync/participants.d.ts +0 -132
- package/dist/sync/participants.js +0 -346
- 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 -71
- 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/syncLog/contract.d.ts +0 -20
- package/dist/syncLog/contract.js +0 -19
- package/dist/syncLog/index.d.ts +0 -1
- package/dist/syncLog/index.js +0 -1
- 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 -212
- package/dist/transaction/auth/capability.js +0 -224
- 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 -56
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -124
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -84
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -108
- 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 -45
- package/dist/transaction/coordination/locator.d.ts +0 -104
- package/dist/transaction/coordination/locator.js +0 -102
- package/dist/transaction/coordination/schema.d.ts +0 -1536
- package/dist/transaction/coordination/schema.js +0 -1177
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -107
- 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 -484
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/footprint.d.ts +0 -111
- package/dist/transaction/footprint.js +0 -0
- 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 -285
- package/dist/transaction/plugin.js +0 -106
- 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 -321
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -427
- 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 -101
- package/dist/transaction/resources/where.js +0 -115
- 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 -120
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/fieldRef.d.ts +0 -38
- package/dist/transaction/schema/fieldRef.js +0 -11
- 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 -58
- package/dist/transaction/schema/openapi.js +0 -501
- package/dist/transaction/schema/relation.d.ts +0 -204
- 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 -351
- package/dist/transaction/schema/schema.js +0 -325
- 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 -131
- package/dist/transaction/transport/httpClient.js +0 -146
- 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 -1388
- 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 -574
- package/dist/transaction/transport/wsTransport.js +0 -1023
- 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 -550
- 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 -50
- package/dist/transaction/utils/duration.js +0 -77
- 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 -420
- package/dist/transaction/wire/accountResponses.js +0 -290
- package/dist/transaction/wire/auth.d.ts +0 -56
- package/dist/transaction/wire/auth.js +0 -63
- 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 -530
- package/dist/transaction/wire/claims.js +0 -327
- 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 -204
- package/dist/transaction/wire/feedEvent.js +0 -65
- 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 -562
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -54
- package/dist/transaction/wire/index.js +0 -83
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelMutations.d.ts +0 -31
- package/dist/transaction/wire/modelMutations.js +0 -52
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/modelShape.d.ts +0 -78
- package/dist/transaction/wire/modelShape.js +0 -74
- 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 -661
- package/dist/transactions/mutations/MutationQueue.js +0 -2807
- 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 -165
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -63
- package/dist/transactions/mutations/deltaConfirmation.js +0 -235
- 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 -187
- package/dist/transactions/mutations/replayValidation.js +0 -164
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/views/QueryView.d.ts +0 -79
- package/dist/views/QueryView.js +0 -218
- package/dist/views/ViewRegistry.d.ts +0 -20
- package/dist/views/ViewRegistry.js +0 -55
- package/dist/views/incrementalView.d.ts +0 -45
- package/dist/views/incrementalView.js +0 -69
- 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
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Authentication and URL resolution for the `Ablo()` client.
|
|
3
|
-
*
|
|
4
|
-
* Each function here makes one decision: it resolves a configuration value with
|
|
5
|
-
* the right precedence, or fails with an actionable message. Together they let
|
|
6
|
-
* the client constructor read as a sequence of named steps rather than a chain
|
|
7
|
-
* of fallbacks.
|
|
8
|
-
*
|
|
9
|
-
* The environment surface is deliberately small: `ABLO_API_KEY` is the only
|
|
10
|
-
* value read from the environment. Every other routing or authentication
|
|
11
|
-
* override is an explicit option, so an app never picks up hidden behavior from
|
|
12
|
-
* a stray environment variable.
|
|
13
|
-
*/
|
|
14
|
-
import type { KeyEnvironment } from '../environment.js';
|
|
15
|
-
/**
|
|
16
|
-
* The credential-resolver callable type. It is defined alongside
|
|
17
|
-
* {@link createEndpointCredentialResolver} in `./credentialEndpoint` and
|
|
18
|
-
* re-exported here so importers of this module keep working. See that module
|
|
19
|
-
* for the full contract.
|
|
20
|
-
*/
|
|
21
|
-
import type { ApiKeySetter } from './credentialEndpoint.js';
|
|
22
|
-
export type { ApiKeySetter };
|
|
23
|
-
/**
|
|
24
|
-
* The client options that decide a credential.
|
|
25
|
-
*
|
|
26
|
-
* This is the ONE declaration of that set. The resolvers below read it, and the
|
|
27
|
-
* transport configs that accept these options derive from it rather than listing
|
|
28
|
-
* the fields again — a second list is how `authEndpoint` came to be supported at
|
|
29
|
-
* runtime, named in an error message, and absent from the type a caller writes
|
|
30
|
-
* against.
|
|
31
|
-
*/
|
|
32
|
-
export interface AuthClientOptions {
|
|
33
|
-
readonly apiKey?: string | ApiKeySetter | null;
|
|
34
|
-
/** A route that mints the token, instead of a key the process holds. */
|
|
35
|
-
readonly authEndpoint?: string | ApiKeySetter | null;
|
|
36
|
-
/** A token the caller already has, used as-is. */
|
|
37
|
-
readonly authToken?: string | null;
|
|
38
|
-
readonly baseURL?: string | null;
|
|
39
|
-
readonly dangerouslyAllowBrowser?: boolean;
|
|
40
|
-
}
|
|
41
|
-
export interface AuthResolveInput {
|
|
42
|
-
/**
|
|
43
|
-
* The full set of options the caller passed to the client constructor. Each
|
|
44
|
-
* resolver reads only the fields it needs; passing the whole object avoids
|
|
45
|
-
* threading many separate parameters through every helper.
|
|
46
|
-
*/
|
|
47
|
-
readonly options: AuthClientOptions;
|
|
48
|
-
readonly env: Record<string, string | undefined>;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Read `process.env` defensively. Works in browser (where `process`
|
|
52
|
-
* is undefined), Node, and edge runtimes that expose a partial
|
|
53
|
-
* process polyfill.
|
|
54
|
-
*/
|
|
55
|
-
export declare function readProcessEnv(): Record<string, string | undefined>;
|
|
56
|
-
export declare function resolveApiKey(input: AuthResolveInput): string | ApiKeySetter | null;
|
|
57
|
-
/**
|
|
58
|
-
* Narrow a resolved `apiKey` to the single resolver the credential lifecycle
|
|
59
|
-
* needs: an async `() => token | null`, or `null` when auth is static — a plain
|
|
60
|
-
* long-lived key string with no refresh, which is the common case.
|
|
61
|
-
*
|
|
62
|
-
* The short-lived per-user browser path passes a function `apiKey` (an
|
|
63
|
-
* {@link ApiKeySetter}), and the SDK then drives the whole credential lifecycle
|
|
64
|
-
* from it: mint-before-connect, the proactive refresh timer with its
|
|
65
|
-
* wake/online/focus re-mint, and the reactive `credential_stale` re-mint. The
|
|
66
|
-
* resolver follows the `ApiKeySetter` contract end to end: resolve a token,
|
|
67
|
-
* resolve `null` when the login is gone (terminal — surfaces `session_expired`
|
|
68
|
-
* and signs the user out), or throw on a transient failure (backs off, without
|
|
69
|
-
* signing out).
|
|
70
|
-
*/
|
|
71
|
-
export declare function resolveCredentialResolver(apiKey: string | ApiKeySetter | null): (() => Promise<string | null>) | null;
|
|
72
|
-
export declare function resolveAuthToken(input: AuthResolveInput): string | null;
|
|
73
|
-
/**
|
|
74
|
-
* The credential axis, not a second copy of it. `environment.ts` documents two
|
|
75
|
-
* incidents caused by conflating the plane a request runs on with the mode a
|
|
76
|
-
* credential was minted in, and states the credential axis must not grow when
|
|
77
|
-
* planes do — so the CLI mismatch path reads the canonical vocabulary rather
|
|
78
|
-
* than restating its members here.
|
|
79
|
-
*/
|
|
80
|
-
type CliMode = KeyEnvironment;
|
|
81
|
-
type StaticApiKeySource = 'option' | 'env';
|
|
82
|
-
interface StaticApiKey {
|
|
83
|
-
readonly key: string;
|
|
84
|
-
readonly source: StaticApiKeySource;
|
|
85
|
-
}
|
|
86
|
-
interface CliCredentialSnapshot {
|
|
87
|
-
readonly mode: CliMode;
|
|
88
|
-
readonly activeProfile: string;
|
|
89
|
-
readonly storedKey?: string;
|
|
90
|
-
}
|
|
91
|
-
export interface CliKeyMismatch {
|
|
92
|
-
readonly source: StaticApiKeySource;
|
|
93
|
-
readonly configuredKeyPrefix: string;
|
|
94
|
-
readonly configuredMode?: CliMode;
|
|
95
|
-
readonly cliMode: CliMode;
|
|
96
|
-
readonly storedKeyPrefix?: string;
|
|
97
|
-
readonly kind: 'mode_mismatch' | 'key_override';
|
|
98
|
-
readonly message: string;
|
|
99
|
-
}
|
|
100
|
-
/** Infer the sandbox or production mode from an Ablo key's prefix. */
|
|
101
|
-
export declare function modeFromApiKey(key: string): CliMode | undefined;
|
|
102
|
-
export declare function describeCliKeyMismatch(configured: StaticApiKey, cli: CliCredentialSnapshot): CliKeyMismatch | null;
|
|
103
|
-
export declare function warnIfCliKeyMismatch(input: AuthResolveInput, warn?: (message: string) => void): Promise<void>;
|
|
104
|
-
export { ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
|
|
105
|
-
/**
|
|
106
|
-
* Normalizes older hosted host names to the current public API domain.
|
|
107
|
-
* Self-hosted or custom URLs pass through unchanged; only the retired
|
|
108
|
-
* first-party host names are rewritten.
|
|
109
|
-
*/
|
|
110
|
-
export declare function normalizeAbloHostedBaseUrl(rawUrl: string): string;
|
|
111
|
-
export declare function resolveBaseURL(input: AuthResolveInput): string;
|
|
112
|
-
/**
|
|
113
|
-
* Guards against using a secret `apiKey` in a browser. A secret key is
|
|
114
|
-
* server-side only by default: shipping an `sk_live_...` key to a browser would
|
|
115
|
-
* expose it in every visitor's network tab. Callers opt in explicitly when the
|
|
116
|
-
* browser instead holds a minted session token (`ek_`/`rk_`) or routes through a
|
|
117
|
-
* server proxy. Throws {@link AbloAuthenticationError} when a secret key is
|
|
118
|
-
* detected in a browser without opt-in.
|
|
119
|
-
*/
|
|
120
|
-
/**
|
|
121
|
-
* Rejects the REMOVED `databaseUrl` dial-in option loudly. The option is gone
|
|
122
|
-
* from the types, but an untyped or stale caller could still pass it — and
|
|
123
|
-
* silently ignoring it would reroute their writes to Ablo-hosted storage,
|
|
124
|
-
* the opposite of what that option used to promise. A construction-time throw
|
|
125
|
-
* turns a wrong-storage surprise into a clear migration instruction.
|
|
126
|
-
*/
|
|
127
|
-
export declare function rejectRemovedDatabaseUrlOption(options: object): void;
|
|
128
|
-
export declare function assertBrowserSafety(input: {
|
|
129
|
-
apiKey: string | ApiKeySetter | null;
|
|
130
|
-
dangerouslyAllowBrowser: boolean | undefined;
|
|
131
|
-
}): void;
|
|
132
|
-
/**
|
|
133
|
-
* Resolves an {@link ApiKeySetter} callable to its current string value, or
|
|
134
|
-
* returns a plain string key as-is. Called at request time so a rotating
|
|
135
|
-
* credential picks up new values between requests. Returns `null` when no key
|
|
136
|
-
* was configured.
|
|
137
|
-
*/
|
|
138
|
-
export declare function resolveApiKeyValue(apiKey: string | ApiKeySetter | null): Promise<string | null>;
|
|
139
|
-
/**
|
|
140
|
-
* Translates a WebSocket URL into the matching HTTP API base URL, defaulting to
|
|
141
|
-
* `${url}/api` when the caller has not overridden `bootstrapBaseUrl`. The
|
|
142
|
-
* bootstrap helper, the hydration coordinator, the credential-exchange flow, and
|
|
143
|
-
* the identity flow all derive their base URL through this one function, so the
|
|
144
|
-
* derivation stays consistent across them.
|
|
145
|
-
*
|
|
146
|
-
* When both `wss://` and `https://` are valid, the ws-to-http rewrite preserves
|
|
147
|
-
* the protocol family: ws becomes http and wss becomes https.
|
|
148
|
-
*/
|
|
149
|
-
export declare function resolveBootstrapBaseUrl(input: {
|
|
150
|
-
readonly url: string;
|
|
151
|
-
readonly bootstrapBaseUrl?: string;
|
|
152
|
-
}): string;
|
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Authentication and URL resolution for the `Ablo()` client.
|
|
3
|
-
*
|
|
4
|
-
* Each function here makes one decision: it resolves a configuration value with
|
|
5
|
-
* the right precedence, or fails with an actionable message. Together they let
|
|
6
|
-
* the client constructor read as a sequence of named steps rather than a chain
|
|
7
|
-
* of fallbacks.
|
|
8
|
-
*
|
|
9
|
-
* The environment surface is deliberately small: `ABLO_API_KEY` is the only
|
|
10
|
-
* value read from the environment. Every other routing or authentication
|
|
11
|
-
* override is an explicit option, so an app never picks up hidden behavior from
|
|
12
|
-
* a stray environment variable.
|
|
13
|
-
*/
|
|
14
|
-
import { AbloAuthenticationError, AbloValidationError } from '../errors.js';
|
|
15
|
-
import { classifyCredentialKind } from '../auth/credentialPolicy.js';
|
|
16
|
-
import { ABLO_HOSTED_API_DOMAIN, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
|
|
17
|
-
import { isCredentialEndpoint, createEndpointCredentialResolver } from './credentialEndpoint.js';
|
|
18
|
-
/**
|
|
19
|
-
* Read `process.env` defensively. Works in browser (where `process`
|
|
20
|
-
* is undefined), Node, and edge runtimes that expose a partial
|
|
21
|
-
* process polyfill.
|
|
22
|
-
*/
|
|
23
|
-
export function readProcessEnv() {
|
|
24
|
-
const maybeGlobal = globalThis;
|
|
25
|
-
return maybeGlobal.process?.env ?? {};
|
|
26
|
-
}
|
|
27
|
-
export function resolveApiKey(input) {
|
|
28
|
-
// `authEndpoint` is the option that names a session-mint route: a URL the
|
|
29
|
-
// client exchanges for a short-lived token, or an async resolver for custom
|
|
30
|
-
// exchanges. It is resolved into an `ApiKeySetter` here — the single point
|
|
31
|
-
// shared by every client variant (WebSocket, HTTP, and protocol clients) — so
|
|
32
|
-
// every downstream consumer sees the same resolver and the credential
|
|
33
|
-
// lifecycle drives renewal off it.
|
|
34
|
-
const endpoint = input.options.authEndpoint;
|
|
35
|
-
const configured = input.options.apiKey;
|
|
36
|
-
if (endpoint != null) {
|
|
37
|
-
if (configured != null) {
|
|
38
|
-
throw new AbloValidationError('Ablo: pass either `apiKey` (a key the process holds) or `authEndpoint` ' +
|
|
39
|
-
'(a route that mints the token) — not both; the client cannot know ' +
|
|
40
|
-
'which credential to use.', { code: 'invalid_options', param: 'authEndpoint' });
|
|
41
|
-
}
|
|
42
|
-
if (typeof endpoint === 'function')
|
|
43
|
-
return endpoint;
|
|
44
|
-
if (!isCredentialEndpoint(endpoint)) {
|
|
45
|
-
throw new AbloValidationError('`authEndpoint` expects a URL or path (e.g. \'/api/ablo-session\') or an ' +
|
|
46
|
-
'async resolver — a key string belongs in `apiKey`.', { code: 'invalid_options', param: 'authEndpoint' });
|
|
47
|
-
}
|
|
48
|
-
return createEndpointCredentialResolver(endpoint);
|
|
49
|
-
}
|
|
50
|
-
// `apiKey` also accepts the endpoint-string form directly, detected the same
|
|
51
|
-
// way — key strings are prefixed (`sk_`/`ek_`/`rk_`), so the two shapes never
|
|
52
|
-
// collide. Only the explicit option is treated this way: an `ABLO_API_KEY`
|
|
53
|
-
// environment value is always a literal key, never an endpoint.
|
|
54
|
-
if (typeof configured === 'string' && isCredentialEndpoint(configured)) {
|
|
55
|
-
return createEndpointCredentialResolver(configured);
|
|
56
|
-
}
|
|
57
|
-
return configured ?? input.env.ABLO_API_KEY ?? null;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Narrow a resolved `apiKey` to the single resolver the credential lifecycle
|
|
61
|
-
* needs: an async `() => token | null`, or `null` when auth is static — a plain
|
|
62
|
-
* long-lived key string with no refresh, which is the common case.
|
|
63
|
-
*
|
|
64
|
-
* The short-lived per-user browser path passes a function `apiKey` (an
|
|
65
|
-
* {@link ApiKeySetter}), and the SDK then drives the whole credential lifecycle
|
|
66
|
-
* from it: mint-before-connect, the proactive refresh timer with its
|
|
67
|
-
* wake/online/focus re-mint, and the reactive `credential_stale` re-mint. The
|
|
68
|
-
* resolver follows the `ApiKeySetter` contract end to end: resolve a token,
|
|
69
|
-
* resolve `null` when the login is gone (terminal — surfaces `session_expired`
|
|
70
|
-
* and signs the user out), or throw on a transient failure (backs off, without
|
|
71
|
-
* signing out).
|
|
72
|
-
*/
|
|
73
|
-
export function resolveCredentialResolver(apiKey) {
|
|
74
|
-
if (typeof apiKey === 'function')
|
|
75
|
-
return apiKey;
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
export function resolveAuthToken(input) {
|
|
79
|
-
return input.options.authToken ?? null;
|
|
80
|
-
}
|
|
81
|
-
function keyPrefix(key) {
|
|
82
|
-
return `${key.slice(0, 12)}…`;
|
|
83
|
-
}
|
|
84
|
-
/** Infer the sandbox or production mode from an Ablo key's prefix. */
|
|
85
|
-
export function modeFromApiKey(key) {
|
|
86
|
-
if (/^(sk|rk)_test_/.test(key))
|
|
87
|
-
return 'sandbox';
|
|
88
|
-
if (/^(sk|rk)_live_/.test(key))
|
|
89
|
-
return 'production';
|
|
90
|
-
return undefined;
|
|
91
|
-
}
|
|
92
|
-
function resolveStaticApiKey(input) {
|
|
93
|
-
if (typeof input.options.apiKey === 'string') {
|
|
94
|
-
// An endpoint-string `apiKey` is not a key — it never participates in
|
|
95
|
-
// CLI-mode mismatch checks (its minted tokens carry the mode instead).
|
|
96
|
-
if (isCredentialEndpoint(input.options.apiKey))
|
|
97
|
-
return null;
|
|
98
|
-
return { key: input.options.apiKey, source: 'option' };
|
|
99
|
-
}
|
|
100
|
-
if (input.options.apiKey !== undefined && input.options.apiKey !== null) {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
const envKey = input.env.ABLO_API_KEY;
|
|
104
|
-
if (typeof envKey === 'string' && envKey.length > 0) {
|
|
105
|
-
return { key: envKey, source: 'env' };
|
|
106
|
-
}
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
function readProfileKeys(value) {
|
|
110
|
-
if (!value || typeof value !== 'object')
|
|
111
|
-
return {};
|
|
112
|
-
const profiles = {};
|
|
113
|
-
for (const [name, raw] of Object.entries(value)) {
|
|
114
|
-
if (!raw || typeof raw !== 'object')
|
|
115
|
-
continue;
|
|
116
|
-
const row = raw;
|
|
117
|
-
const sandbox = row.sandbox;
|
|
118
|
-
const production = row.production;
|
|
119
|
-
profiles[name] = {
|
|
120
|
-
sandbox: sandbox && typeof sandbox === 'object' ? sandbox : undefined,
|
|
121
|
-
production: production && typeof production === 'object' ? production : undefined,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
return profiles;
|
|
125
|
-
}
|
|
126
|
-
function legacyProfileKeys(value) {
|
|
127
|
-
if (!value)
|
|
128
|
-
return { sandbox: undefined, production: undefined };
|
|
129
|
-
const sandbox = value.sandbox;
|
|
130
|
-
const production = value.production;
|
|
131
|
-
if ((sandbox && typeof sandbox === 'object') ||
|
|
132
|
-
(production && typeof production === 'object')) {
|
|
133
|
-
return {
|
|
134
|
-
sandbox: sandbox && typeof sandbox === 'object' ? sandbox : undefined,
|
|
135
|
-
production: production && typeof production === 'object' ? production : undefined,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
if (typeof value.apiKey === 'string') {
|
|
139
|
-
return { sandbox: { apiKey: value.apiKey }, production: undefined };
|
|
140
|
-
}
|
|
141
|
-
return { sandbox: undefined, production: undefined };
|
|
142
|
-
}
|
|
143
|
-
function normalizeCliMode(value) {
|
|
144
|
-
return value === 'sandbox' || value === 'production' ? value : undefined;
|
|
145
|
-
}
|
|
146
|
-
function activeProjectSlug(value) {
|
|
147
|
-
if (!value || typeof value !== 'object')
|
|
148
|
-
return undefined;
|
|
149
|
-
const slug = value.slug;
|
|
150
|
-
return typeof slug === 'string' && slug.length > 0 ? slug : undefined;
|
|
151
|
-
}
|
|
152
|
-
function importNodeBuiltin(specifier) {
|
|
153
|
-
// Node-only runtime import (CLI credential snapshot). The call is dead in
|
|
154
|
-
// browser/edge builds — guarded by `process.versions.node` and `window`
|
|
155
|
-
// checks in the callers — but bundlers still try to resolve the dynamic
|
|
156
|
-
// `import()` and Turbopack fails the build on the unanalyzable specifier.
|
|
157
|
-
// The magic comments tell each bundler to emit the import verbatim and never
|
|
158
|
-
// resolve it. Keep both so webpack and Turbopack consumers are covered.
|
|
159
|
-
return import(/* webpackIgnore: true */ /* turbopackIgnore: true */ specifier);
|
|
160
|
-
}
|
|
161
|
-
async function readJsonIfPresent(path) {
|
|
162
|
-
try {
|
|
163
|
-
const { readFile } = await importNodeBuiltin('node:fs/promises');
|
|
164
|
-
const text = await readFile(path, 'utf8');
|
|
165
|
-
const parsed = JSON.parse(text);
|
|
166
|
-
return parsed && typeof parsed === 'object' ? parsed : null;
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
async function readCliCredentialSnapshot(env) {
|
|
173
|
-
const processLike = globalThis.process;
|
|
174
|
-
if (!processLike?.versions?.node)
|
|
175
|
-
return null;
|
|
176
|
-
if (typeof window !== 'undefined')
|
|
177
|
-
return null;
|
|
178
|
-
const [{ homedir }, { join }] = await Promise.all([
|
|
179
|
-
importNodeBuiltin('node:os'),
|
|
180
|
-
importNodeBuiltin('node:path'),
|
|
181
|
-
]);
|
|
182
|
-
const dir = env.ABLO_CONFIG_DIR
|
|
183
|
-
?? (env.XDG_CONFIG_HOME ? join(env.XDG_CONFIG_HOME, 'ablo') : join(homedir(), '.config', 'ablo'));
|
|
184
|
-
const [cfg, creds] = await Promise.all([
|
|
185
|
-
readJsonIfPresent(join(dir, 'config.json')),
|
|
186
|
-
readJsonIfPresent(join(dir, 'credentials.json')),
|
|
187
|
-
]);
|
|
188
|
-
const mode = normalizeCliMode(cfg?.mode) ?? normalizeCliMode(creds?.mode);
|
|
189
|
-
const activeProfile = activeProjectSlug(cfg?.activeProject) ?? 'default';
|
|
190
|
-
const profiles = {
|
|
191
|
-
...readProfileKeys(creds?.profiles),
|
|
192
|
-
...readProfileKeys(cfg?.profiles),
|
|
193
|
-
};
|
|
194
|
-
if (!profiles[activeProfile]) {
|
|
195
|
-
const legacy = { ...legacyProfileKeys(cfg), ...legacyProfileKeys(creds) };
|
|
196
|
-
if (legacy.sandbox?.apiKey || legacy.production?.apiKey) {
|
|
197
|
-
profiles[activeProfile] = legacy;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
const effectiveMode = mode ?? (Object.keys(profiles).length > 0 ? 'sandbox' : undefined);
|
|
201
|
-
if (!effectiveMode)
|
|
202
|
-
return null;
|
|
203
|
-
return {
|
|
204
|
-
mode: effectiveMode,
|
|
205
|
-
activeProfile,
|
|
206
|
-
...(profiles[activeProfile]?.[effectiveMode]?.apiKey
|
|
207
|
-
? { storedKey: profiles[activeProfile][effectiveMode].apiKey }
|
|
208
|
-
: {}),
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
export function describeCliKeyMismatch(configured, cli) {
|
|
212
|
-
const configuredMode = modeFromApiKey(configured.key);
|
|
213
|
-
const configuredKeyPrefix = keyPrefix(configured.key);
|
|
214
|
-
const storedKeyPrefix = cli.storedKey ? keyPrefix(cli.storedKey) : undefined;
|
|
215
|
-
const sourceLabel = configured.source === 'env' ? 'ABLO_API_KEY' : 'configured apiKey';
|
|
216
|
-
if (configuredMode && configuredMode !== cli.mode) {
|
|
217
|
-
return {
|
|
218
|
-
source: configured.source,
|
|
219
|
-
configuredKeyPrefix,
|
|
220
|
-
configuredMode,
|
|
221
|
-
cliMode: cli.mode,
|
|
222
|
-
...(storedKeyPrefix ? { storedKeyPrefix } : {}),
|
|
223
|
-
kind: 'mode_mismatch',
|
|
224
|
-
message: `${sourceLabel} is a ${configuredMode} key (${configuredKeyPrefix}) but the Ablo CLI is in ` +
|
|
225
|
-
`${cli.mode} mode${storedKeyPrefix ? ` (active stored key ${storedKeyPrefix})` : ''}. ` +
|
|
226
|
-
`Requests will use ${configuredMode}. Use the ${cli.mode} key, unset ABLO_API_KEY, ` +
|
|
227
|
-
`or run \`ablo mode ${configuredMode}\` intentionally.`,
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
if (configured.source === 'env' && cli.storedKey && configured.key !== cli.storedKey) {
|
|
231
|
-
return {
|
|
232
|
-
source: configured.source,
|
|
233
|
-
configuredKeyPrefix,
|
|
234
|
-
...(configuredMode ? { configuredMode } : {}),
|
|
235
|
-
cliMode: cli.mode,
|
|
236
|
-
storedKeyPrefix,
|
|
237
|
-
kind: 'key_override',
|
|
238
|
-
message: `ABLO_API_KEY (${configuredKeyPrefix}) overrides the CLI's stored active ${cli.mode} key ` +
|
|
239
|
-
`(${storedKeyPrefix}). Requests will use the environment key. Unset ABLO_API_KEY to use ` +
|
|
240
|
-
'`ablo status` / `ablo mode` credentials.',
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
let warnedCliKeyMismatch = false;
|
|
246
|
-
export async function warnIfCliKeyMismatch(input, warn) {
|
|
247
|
-
if (warnedCliKeyMismatch)
|
|
248
|
-
return;
|
|
249
|
-
if (input.env.NODE_ENV === 'production')
|
|
250
|
-
return;
|
|
251
|
-
const configured = resolveStaticApiKey(input);
|
|
252
|
-
if (!configured)
|
|
253
|
-
return;
|
|
254
|
-
const cli = await readCliCredentialSnapshot(input.env);
|
|
255
|
-
if (!cli)
|
|
256
|
-
return;
|
|
257
|
-
const mismatch = describeCliKeyMismatch(configured, cli);
|
|
258
|
-
if (!mismatch)
|
|
259
|
-
return;
|
|
260
|
-
warnedCliKeyMismatch = true;
|
|
261
|
-
if (warn)
|
|
262
|
-
warn(mismatch.message);
|
|
263
|
-
else if (typeof console !== 'undefined')
|
|
264
|
-
console.warn('[Ablo]', mismatch.message);
|
|
265
|
-
}
|
|
266
|
-
// Declared in `./hostedEndpoints`, the single source of the hosted domain, and
|
|
267
|
-
// re-exported here so existing import paths keep working.
|
|
268
|
-
export { ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
|
|
269
|
-
const LEGACY_HOSTED_API_HOSTS = new Set([
|
|
270
|
-
'mesh.ablo.finance',
|
|
271
|
-
'mesh-staging.ablo.finance',
|
|
272
|
-
'api.ablo.finance',
|
|
273
|
-
'sync-staging.ablo.finance',
|
|
274
|
-
]);
|
|
275
|
-
/**
|
|
276
|
-
* Normalizes older hosted host names to the current public API domain.
|
|
277
|
-
* Self-hosted or custom URLs pass through unchanged; only the retired
|
|
278
|
-
* first-party host names are rewritten.
|
|
279
|
-
*/
|
|
280
|
-
export function normalizeAbloHostedBaseUrl(rawUrl) {
|
|
281
|
-
const trimmed = rawUrl.trim();
|
|
282
|
-
if (!trimmed)
|
|
283
|
-
return trimmed;
|
|
284
|
-
// A scheme-less value (e.g. `api-staging.abloatai.com`) is treated as a
|
|
285
|
-
// relative URL: `new URL()` throws on it, and a later `fetch` would resolve it
|
|
286
|
-
// against the current page — producing a 404 from the app's own origin.
|
|
287
|
-
// Prepending a scheme makes the base absolute. `https` matches
|
|
288
|
-
// {@link ABLO_HOSTED_HTTP_BASE_URL}; the socket layer derives `wss` from it.
|
|
289
|
-
// An existing scheme (ws, wss, http, or https) is preserved untouched.
|
|
290
|
-
const schemed = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
|
|
291
|
-
try {
|
|
292
|
-
const url = new URL(schemed);
|
|
293
|
-
// Canonicalize the scheme to the HTTP family: accept all four schemes
|
|
294
|
-
// (http, https, ws, wss), normalize at this single entry point, and let
|
|
295
|
-
// each layer derive its own protocol (the socket layer maps http to ws and
|
|
296
|
-
// https to wss; fetch uses the URL as-is). Without this, a `ws://` base URL
|
|
297
|
-
// reaches HTTP consumers un-normalized and the client fails at startup
|
|
298
|
-
// instead of connecting.
|
|
299
|
-
if (url.protocol === 'ws:')
|
|
300
|
-
url.protocol = 'http:';
|
|
301
|
-
if (url.protocol === 'wss:')
|
|
302
|
-
url.protocol = 'https:';
|
|
303
|
-
if (!LEGACY_HOSTED_API_HOSTS.has(url.hostname)) {
|
|
304
|
-
return url.toString().replace(/\/+$/, '');
|
|
305
|
-
}
|
|
306
|
-
url.hostname = ABLO_HOSTED_API_DOMAIN;
|
|
307
|
-
if (url.protocol === 'http:')
|
|
308
|
-
url.protocol = 'https:';
|
|
309
|
-
return url.toString().replace(/\/+$/, '');
|
|
310
|
-
}
|
|
311
|
-
catch {
|
|
312
|
-
return schemed;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
export function resolveBaseURL(input) {
|
|
316
|
-
return normalizeAbloHostedBaseUrl(input.options.baseURL ?? ABLO_DEFAULT_BASE_URL);
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Guards against using a secret `apiKey` in a browser. A secret key is
|
|
320
|
-
* server-side only by default: shipping an `sk_live_...` key to a browser would
|
|
321
|
-
* expose it in every visitor's network tab. Callers opt in explicitly when the
|
|
322
|
-
* browser instead holds a minted session token (`ek_`/`rk_`) or routes through a
|
|
323
|
-
* server proxy. Throws {@link AbloAuthenticationError} when a secret key is
|
|
324
|
-
* detected in a browser without opt-in.
|
|
325
|
-
*/
|
|
326
|
-
/**
|
|
327
|
-
* Rejects the REMOVED `databaseUrl` dial-in option loudly. The option is gone
|
|
328
|
-
* from the types, but an untyped or stale caller could still pass it — and
|
|
329
|
-
* silently ignoring it would reroute their writes to Ablo-hosted storage,
|
|
330
|
-
* the opposite of what that option used to promise. A construction-time throw
|
|
331
|
-
* turns a wrong-storage surprise into a clear migration instruction.
|
|
332
|
-
*/
|
|
333
|
-
export function rejectRemovedDatabaseUrlOption(options) {
|
|
334
|
-
const legacyValue = Reflect.get(options, 'databaseUrl');
|
|
335
|
-
if (legacyValue == null)
|
|
336
|
-
return;
|
|
337
|
-
throw new AbloValidationError('The `databaseUrl` option was removed. Your database connects through ' +
|
|
338
|
-
'`ablo connect` now: Ablo writes it directly with a scoped DML role and ' +
|
|
339
|
-
'confirms through its replication stream. Run `npx ablo connect` to ' +
|
|
340
|
-
'register it, then construct the client with your API key only.', { code: 'invalid_body' });
|
|
341
|
-
}
|
|
342
|
-
export function assertBrowserSafety(input) {
|
|
343
|
-
const inBrowser = typeof window !== 'undefined';
|
|
344
|
-
if (!input.dangerouslyAllowBrowser &&
|
|
345
|
-
inBrowser &&
|
|
346
|
-
typeof input.apiKey === 'string' &&
|
|
347
|
-
classifyCredentialKind(input.apiKey) === 'secret') {
|
|
348
|
-
throw new AbloAuthenticationError("It looks like you're running in a browser-like environment.\n\n" +
|
|
349
|
-
'This is disabled by default — your secret API key would be ' +
|
|
350
|
-
"exposed to every visitor's network tab. If you understand the risks " +
|
|
351
|
-
'and have appropriate mitigations in place, you can set the ' +
|
|
352
|
-
'`dangerouslyAllowBrowser` option to `true`, e.g.,\n\n' +
|
|
353
|
-
' Ablo({ schema, apiKey, dangerouslyAllowBrowser: true });\n', { code: 'browser_apikey_blocked' });
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* Resolves an {@link ApiKeySetter} callable to its current string value, or
|
|
358
|
-
* returns a plain string key as-is. Called at request time so a rotating
|
|
359
|
-
* credential picks up new values between requests. Returns `null` when no key
|
|
360
|
-
* was configured.
|
|
361
|
-
*/
|
|
362
|
-
export async function resolveApiKeyValue(apiKey) {
|
|
363
|
-
if (apiKey == null)
|
|
364
|
-
return null;
|
|
365
|
-
if (typeof apiKey === 'function')
|
|
366
|
-
return apiKey();
|
|
367
|
-
return apiKey;
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Translates a WebSocket URL into the matching HTTP API base URL, defaulting to
|
|
371
|
-
* `${url}/api` when the caller has not overridden `bootstrapBaseUrl`. The
|
|
372
|
-
* bootstrap helper, the hydration coordinator, the credential-exchange flow, and
|
|
373
|
-
* the identity flow all derive their base URL through this one function, so the
|
|
374
|
-
* derivation stays consistent across them.
|
|
375
|
-
*
|
|
376
|
-
* When both `wss://` and `https://` are valid, the ws-to-http rewrite preserves
|
|
377
|
-
* the protocol family: ws becomes http and wss becomes https.
|
|
378
|
-
*/
|
|
379
|
-
export function resolveBootstrapBaseUrl(input) {
|
|
380
|
-
if (input.bootstrapBaseUrl) {
|
|
381
|
-
// Coerce ws/wss to http/https on the override path as well. This base URL is
|
|
382
|
-
// used for HTTP fetches (identity resolution, credential exchange, and
|
|
383
|
-
// bootstrap), and the browser `fetch` rejects ws and wss schemes outright.
|
|
384
|
-
// The override can legitimately arrive with a WebSocket scheme when a caller
|
|
385
|
-
// derives it as `${baseUrl}/api` from a WebSocket base URL, so normalize it
|
|
386
|
-
// here rather than failing at fetch time.
|
|
387
|
-
return ensureApiSuffix(normalizeAbloHostedBaseUrl(input.bootstrapBaseUrl).replace(/^ws/, 'http'));
|
|
388
|
-
}
|
|
389
|
-
const url = normalizeAbloHostedBaseUrl(input.url);
|
|
390
|
-
return ensureApiSuffix(url.replace(/^ws/, 'http'));
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* Ensures the HTTP base ends in the `/api` route segment that every endpoint is
|
|
394
|
-
* mounted under.
|
|
395
|
-
*
|
|
396
|
-
* A hosted deployment that sets a custom `baseURL` or `bootstrapBaseUrl` (a
|
|
397
|
-
* custom subdomain, a staging host, and so on) without the `/api` suffix would
|
|
398
|
-
* send every credential exchange to `…/auth/capability` instead of
|
|
399
|
-
* `…/api/auth/capability`, producing a 404 that surfaces as `exchange_failed`.
|
|
400
|
-
* Since the client builds routes relative to this base and no valid deployment
|
|
401
|
-
* serves them from the root, appending a single trailing `/api` here is always
|
|
402
|
-
* correct, and it is idempotent for callers who already include it.
|
|
403
|
-
*/
|
|
404
|
-
function ensureApiSuffix(httpBase) {
|
|
405
|
-
const trimmed = httpBase.replace(/\/+$/, '');
|
|
406
|
-
try {
|
|
407
|
-
const u = new URL(trimmed);
|
|
408
|
-
const segments = u.pathname.split('/').filter(Boolean);
|
|
409
|
-
if (segments[segments.length - 1] === 'api')
|
|
410
|
-
return trimmed;
|
|
411
|
-
u.pathname = `${u.pathname.replace(/\/+$/, '')}/api`;
|
|
412
|
-
return u.toString().replace(/\/+$/, '');
|
|
413
|
-
}
|
|
414
|
-
catch {
|
|
415
|
-
// Should be unreachable after `normalizeAbloHostedBaseUrl`, which yields an
|
|
416
|
-
// absolute URL, but fall back to a string check rather than throwing.
|
|
417
|
-
return trimmed.endsWith("/api") ? trimmed : `${trimmed}/api`;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The hand-off the identity flow performs once a credential resolves: it names
|
|
3
|
-
* the account scope and the sync groups everything downstream should read under.
|
|
4
|
-
*
|
|
5
|
-
* The core defines the port; the consumer supplies the implementation. That
|
|
6
|
-
* keeps identity resolution — which is settlement's business — from depending on
|
|
7
|
-
* whatever happens to materialise rows on the other side of it (ADR 0016). The
|
|
8
|
-
* reactive engine's `BootstrapFetcher` satisfies this structurally.
|
|
9
|
-
*/
|
|
10
|
-
export interface BootstrapScope {
|
|
11
|
-
/** Bind subsequent reads to one account's cache partition. */
|
|
12
|
-
setCacheScope(cacheScope: string): void;
|
|
13
|
-
/** Narrow subsequent reads to the sync groups the credential authorises. */
|
|
14
|
-
setSyncGroups(syncGroups: readonly string[] | undefined): void;
|
|
15
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|