@abloatai/ablo 0.26.0 → 0.27.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/CHANGELOG.md +14 -0
- package/README.md +101 -85
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +131 -147
- package/dist/Database.d.ts +54 -68
- package/dist/Database.js +97 -113
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +12 -16
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +46 -61
- package/dist/ModelRegistry.d.ts +21 -19
- package/dist/ModelRegistry.js +23 -27
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +5 -6
- package/dist/SyncClient.d.ts +112 -112
- package/dist/SyncClient.js +165 -172
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +27 -32
- package/dist/agent/Agent.js +18 -19
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +6 -7
- package/dist/ai-sdk/wrap.js +1 -1
- package/dist/auth/credentialPolicy.d.ts +69 -74
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +6 -5
- package/dist/auth/credentialSource.js +9 -10
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +31 -37
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +167 -119
- package/dist/client/Ablo.d.ts +73 -73
- package/dist/client/Ablo.js +125 -160
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +133 -38
- package/dist/client/auth.d.ts +47 -47
- package/dist/client/auth.js +108 -117
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +5 -6
- package/dist/client/consoleLogger.js +5 -6
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +25 -30
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +152 -122
- package/dist/client/credentialEndpoint.d.ts +40 -42
- package/dist/client/credentialEndpoint.js +35 -36
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +9 -12
- package/dist/client/hostedEndpoints.js +9 -12
- package/dist/client/httpClient.d.ts +57 -53
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +47 -58
- package/dist/client/modelRegistration.d.ts +5 -9
- package/dist/client/modelRegistration.js +67 -87
- package/dist/client/options.d.ts +134 -157
- package/dist/client/options.js +3 -7
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +64 -75
- package/dist/client/resourceTypes.js +4 -10
- package/dist/client/schemaConfig.d.ts +31 -43
- package/dist/client/schemaConfig.js +38 -50
- package/dist/client/sessionMint.d.ts +16 -12
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +8 -9
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +15 -20
- package/dist/client/wsMutationExecutor.js +17 -23
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -4
- package/dist/coordination/index.d.ts +10 -8
- package/dist/coordination/index.js +14 -12
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -10
- package/dist/coordination/trace.js +13 -14
- package/dist/core/DatabaseManager.d.ts +5 -7
- package/dist/core/DatabaseManager.js +15 -19
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +22 -28
- package/dist/core/QueryView.d.ts +8 -8
- package/dist/core/QueryView.js +2 -2
- package/dist/core/StoreManager.d.ts +12 -14
- package/dist/core/StoreManager.js +21 -24
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +17 -12
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +42 -43
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +63 -61
- package/dist/core/storeContract.js +8 -12
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +107 -99
- package/dist/errorCodes.js +131 -132
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +30 -27
- package/dist/index.js +89 -86
- package/dist/interfaces/index.d.ts +102 -113
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +41 -40
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +145 -156
- package/dist/mutators/defineMutators.d.ts +23 -34
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +104 -100
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +28 -23
- package/dist/query/client.js +45 -43
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +1 -1
- package/dist/react/AbloProvider.js +2 -2
- package/dist/react/context.d.ts +25 -28
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +16 -14
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +10 -11
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +8 -8
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useReactive.js +2 -2
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +20 -24
- package/dist/schema/ddlLock.js +18 -23
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +35 -48
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +2 -2
- package/dist/schema/index.js +21 -23
- package/dist/schema/model.d.ts +118 -143
- package/dist/schema/model.js +22 -33
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +5 -3
- package/dist/schema/queries.d.ts +29 -31
- package/dist/schema/queries.js +23 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +16 -13
- package/dist/schema/residency.js +16 -13
- package/dist/schema/roles.d.ts +36 -43
- package/dist/schema/roles.js +31 -37
- package/dist/schema/schema.d.ts +33 -42
- package/dist/schema/schema.js +31 -32
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +28 -31
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +30 -25
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +30 -25
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +24 -23
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +9 -8
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +22 -25
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +17 -11
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +28 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +46 -58
- package/dist/source/factory.js +22 -27
- package/dist/source/index.d.ts +7 -9
- package/dist/source/index.js +12 -14
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +9 -10
- package/dist/source/next.js +6 -7
- package/dist/source/pushQueue.d.ts +69 -47
- package/dist/source/pushQueue.js +32 -28
- package/dist/source/signing.d.ts +46 -17
- package/dist/source/signing.js +28 -11
- package/dist/source/types.d.ts +121 -104
- package/dist/source/types.js +13 -14
- package/dist/stores/ObjectStore.d.ts +10 -11
- package/dist/stores/ObjectStore.js +11 -12
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +27 -20
- package/dist/surface.js +27 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
- package/dist/sync/ConnectionManager.d.ts +39 -50
- package/dist/sync/ConnectionManager.js +55 -66
- package/dist/sync/NetworkProbe.d.ts +24 -29
- package/dist/sync/NetworkProbe.js +63 -69
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
- package/dist/sync/SyncWebSocket.d.ts +139 -165
- package/dist/sync/SyncWebSocket.js +191 -223
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +11 -11
- package/dist/sync/bootstrapApply.d.ts +34 -24
- package/dist/sync/bootstrapApply.js +27 -19
- package/dist/sync/commitFrames.d.ts +21 -20
- package/dist/sync/commitFrames.js +18 -18
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +105 -23
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +12 -14
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +104 -104
- package/dist/sync/credentialLifecycle.js +140 -147
- package/dist/sync/deltaPipeline.d.ts +36 -34
- package/dist/sync/deltaPipeline.js +64 -65
- package/dist/sync/groupChange.d.ts +63 -61
- package/dist/sync/groupChange.js +74 -78
- package/dist/sync/heartbeat.d.ts +34 -33
- package/dist/sync/heartbeat.js +31 -31
- package/dist/sync/participants.d.ts +19 -19
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +17 -21
- package/dist/sync/syncCursor.js +17 -21
- package/dist/sync/syncPlan.d.ts +28 -36
- package/dist/sync/syncPlan.js +18 -19
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +35 -36
- package/dist/sync/wsFrameHandlers.js +63 -67
- package/dist/testing/fixtures/bootstrap.d.ts +12 -6
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +30 -33
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +11 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +3 -3
- package/dist/testing/index.js +2 -2
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
- package/dist/testing/mocks/MockSyncContext.js +15 -13
- package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +181 -176
- package/dist/transactions/TransactionQueue.js +338 -350
- package/dist/transactions/TransactionStore.d.ts +6 -4
- package/dist/transactions/TransactionStore.js +6 -4
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +41 -17
- package/dist/transactions/coalesceRules.js +40 -17
- package/dist/transactions/commitPayload.d.ts +48 -52
- package/dist/transactions/commitPayload.js +48 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
- package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +71 -77
- package/dist/types/index.js +22 -22
- package/dist/types/modelData.d.ts +6 -8
- package/dist/types/modelData.js +5 -7
- package/dist/types/participant.d.ts +10 -11
- package/dist/types/participant.js +6 -8
- package/dist/types/streams.d.ts +208 -195
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +30 -31
- package/dist/wire/errorEnvelope.js +34 -40
- package/dist/wire/frames.d.ts +79 -86
- package/dist/wire/frames.js +26 -33
- package/dist/wire/index.d.ts +14 -12
- package/dist/wire/index.js +30 -26
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +25 -32
- package/dist/wire/protocol.js +25 -32
- package/dist/wire/protocolVersion.d.ts +44 -40
- package/dist/wire/protocolVersion.js +44 -40
- package/docs/coordination.md +59 -0
- package/package.json +11 -10
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -8
- package/dist/server/storage-mode.js +0 -28
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/transactions/optimistic.d.ts +0 -24
- package/dist/transactions/optimistic.js +0 -45
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/client/ApiClient.js
CHANGED
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* nouns directly to HTTP routes on sync-server.
|
|
2
|
+
* The stateless API client behind `Ablo({ apiKey })`. It carries no schema,
|
|
3
|
+
* object pool, local database, or WebSocket, and maps the public Model, Claim,
|
|
4
|
+
* and Commit nouns directly to HTTP routes on the server. This is the transport
|
|
5
|
+
* used for server-side agents, workers, and serverless code.
|
|
7
6
|
*/
|
|
8
7
|
import { AbloClaimedError, AbloAuthenticationError, AbloConnectionError, AbloValidationError, AbloNotFoundError, claimedError, translateHttpError, } from '../errors.js';
|
|
9
8
|
import { reconcileFunctionalUpdate, } from './functionalUpdate.js';
|
|
10
9
|
import { assertBrowserSafety, readProcessEnv, resolveApiKey, resolveApiKeyValue, resolveAuthToken, resolveBaseURL, resolveBootstrapBaseUrl, resolveDatabaseUrl, warnIfCliKeyMismatch, warnIfDatabaseUrlEnvIgnored, warnIfDatabaseUrlDeprecated, } from './auth.js';
|
|
11
10
|
import { registerDataSource } from './registerDataSource.js';
|
|
12
11
|
import { PROTOCOL_VERSION, PROTOCOL_VERSION_HEADER } from '../wire/protocolVersion.js';
|
|
13
|
-
import { toSeconds } from '../utils/duration.js';
|
|
12
|
+
import { toMs, toSeconds } from '../utils/duration.js';
|
|
13
|
+
import { heartbeatCadenceMs, resolveHeartbeatOptions, startClaimHeartbeatLoop, } from './claimHeartbeatLoop.js';
|
|
14
14
|
import { mintSession } from './sessionMint.js';
|
|
15
|
+
/**
|
|
16
|
+
* Interpret a heartbeat reply for a lease this handle HOLDS: anything other
|
|
17
|
+
* than `held` means the lease is no longer ours (a holder cannot be `queued`;
|
|
18
|
+
* `lost` rides a 409 that the wire error mapping already surfaces as
|
|
19
|
+
* AbloClaimedError before reaching here). The thrown loss is the definitive
|
|
20
|
+
* signal that stops the auto-heartbeat loop.
|
|
21
|
+
*/
|
|
22
|
+
function heldHeartbeatReply(reply, label) {
|
|
23
|
+
if (reply.status === 'held' && typeof reply.expiresAt === 'number') {
|
|
24
|
+
return {
|
|
25
|
+
expiresAt: reply.expiresAt,
|
|
26
|
+
...(reply.queueDepth !== undefined ? { queueDepth: reply.queueDepth } : {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
throw new AbloClaimedError(`The lease behind ${label} is no longer held — it expired or was granted onward. Re-acquire the claim and retry; a write attempted under the old lease is rejected by its \`readAt\` guard.`, { code: 'claim_lost' });
|
|
30
|
+
}
|
|
15
31
|
import { assertWriteOptions } from './writeOptionsSchema.js';
|
|
16
32
|
/** Default per-request deadline for the stateless HTTP transport. */
|
|
17
33
|
export const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
@@ -32,11 +48,12 @@ export function createProtocolClient(options) {
|
|
|
32
48
|
databaseUrl: configuredDatabaseUrl,
|
|
33
49
|
dangerouslyAllowBrowser: options.dangerouslyAllowBrowser,
|
|
34
50
|
});
|
|
35
|
-
// Observability
|
|
36
|
-
// claim
|
|
51
|
+
// Observability hook for the stateless HTTP transport. The WebSocket transport
|
|
52
|
+
// emits claim and conflict events; the HTTP path (server-side agents,
|
|
37
53
|
// `transport: 'http'`) emitted nothing, so a `ClaimLog` handed to a headless
|
|
38
|
-
// agent
|
|
39
|
-
// coordination-conflict rejection.
|
|
54
|
+
// agent evaluation stayed empty. This mirrors the two WebSocket events here:
|
|
55
|
+
// claim acquired and coordination-conflict rejection. A no-op when no provider
|
|
56
|
+
// is configured.
|
|
40
57
|
const observability = options.observability;
|
|
41
58
|
// Shared by the two HTTP write doors (`commits.create` + per-model
|
|
42
59
|
// `mutateModel`): a rejected write whose code is a coordination conflict is
|
|
@@ -139,7 +156,7 @@ export function createProtocolClient(options) {
|
|
|
139
156
|
// is combined with the deadline via a shared controller — the portable
|
|
140
157
|
// equivalent of `AbortSignal.any([caller, AbortSignal.timeout(t)])`,
|
|
141
158
|
// which older runtimes (and the jsdom test env) don't implement. The
|
|
142
|
-
// same pattern already guards `query/client.ts` and `
|
|
159
|
+
// same pattern already guards `query/client.ts` and `BootstrapFetcher`.
|
|
143
160
|
const callerSignal = requestInit.signal ?? undefined;
|
|
144
161
|
const controller = new AbortController();
|
|
145
162
|
const onCallerAbort = () => { controller.abort(callerSignal?.reason); };
|
|
@@ -482,11 +499,11 @@ export function createProtocolClient(options) {
|
|
|
482
499
|
queue: claimOptions.queue,
|
|
483
500
|
}),
|
|
484
501
|
});
|
|
485
|
-
// The fair-queue grant is
|
|
486
|
-
//
|
|
487
|
-
//
|
|
488
|
-
//
|
|
489
|
-
//
|
|
502
|
+
// The fair-queue grant is pushed over a WebSocket (`claim_granted`), which
|
|
503
|
+
// this stateless HTTP client doesn't hold. Returning a handle here would be
|
|
504
|
+
// a phantom holder — a lease we can't confirm is ours. So a queued response
|
|
505
|
+
// is surfaced as a typed claimed signal; callers that need to wait in line
|
|
506
|
+
// use the realtime (WebSocket-backed) `ablo.<model>.claim`.
|
|
490
507
|
if (body.status === 'queued') {
|
|
491
508
|
throw new AbloClaimedError(`Target ${claimOptions.target.model}/${claimOptions.target.id} is held; ` +
|
|
492
509
|
`queued at position ${body.position ?? 0}. The HTTP client can't await ` +
|
|
@@ -500,9 +517,24 @@ export function createProtocolClient(options) {
|
|
|
500
517
|
released = true;
|
|
501
518
|
await requestJson(`/v1/claims/${encodeURIComponent(id)}`, { method: 'DELETE' });
|
|
502
519
|
};
|
|
520
|
+
// The by-id twin of the model-scoped heartbeat — same reply contract.
|
|
521
|
+
const heartbeat = async (beatOptions) => {
|
|
522
|
+
const resolved = resolveHeartbeatOptions(beatOptions);
|
|
523
|
+
const reply = await requestJson(`/v1/claims/${encodeURIComponent(id)}/heartbeat`, {
|
|
524
|
+
method: 'POST',
|
|
525
|
+
body: JSON.stringify({
|
|
526
|
+
...(resolved.ttl !== undefined ? { ttl: resolved.ttl } : {}),
|
|
527
|
+
...(resolved.details !== undefined
|
|
528
|
+
? { details: resolved.details }
|
|
529
|
+
: {}),
|
|
530
|
+
}),
|
|
531
|
+
});
|
|
532
|
+
return heldHeartbeatReply(reply, `claim ${id}`);
|
|
533
|
+
};
|
|
503
534
|
return {
|
|
504
535
|
object: 'claim',
|
|
505
536
|
id,
|
|
537
|
+
heartbeat,
|
|
506
538
|
reason: claimOptions.reason,
|
|
507
539
|
target: {
|
|
508
540
|
type: claimOptions.target.model,
|
|
@@ -523,6 +555,23 @@ export function createProtocolClient(options) {
|
|
|
523
555
|
waitFor(target, options) {
|
|
524
556
|
return waitForNoClaims(target, options);
|
|
525
557
|
},
|
|
558
|
+
async heartbeatAll(options) {
|
|
559
|
+
const reply = await requestJson('/v1/claims/heartbeat', {
|
|
560
|
+
method: 'POST',
|
|
561
|
+
body: JSON.stringify(options?.ttl !== undefined ? { ttl: options.ttl } : {}),
|
|
562
|
+
});
|
|
563
|
+
return (reply.results ?? []).flatMap((entry) => typeof entry.claimId === 'string' && typeof entry.expiresAt === 'number'
|
|
564
|
+
? [
|
|
565
|
+
{
|
|
566
|
+
claimId: entry.claimId,
|
|
567
|
+
expiresAt: entry.expiresAt,
|
|
568
|
+
...(entry.queueDepth !== undefined
|
|
569
|
+
? { queueDepth: entry.queueDepth }
|
|
570
|
+
: {}),
|
|
571
|
+
},
|
|
572
|
+
]
|
|
573
|
+
: []);
|
|
574
|
+
},
|
|
526
575
|
};
|
|
527
576
|
async function listModel(modelName, options) {
|
|
528
577
|
const params = new URLSearchParams();
|
|
@@ -554,11 +603,11 @@ export function createProtocolClient(options) {
|
|
|
554
603
|
const query = await requestJson(`/v1/models/${encodeURIComponent(modelName)}/${encodeURIComponent(params.id)}`, {
|
|
555
604
|
method: 'GET',
|
|
556
605
|
});
|
|
557
|
-
//
|
|
606
|
+
// A miss is `data: undefined`, not a thrown error. The WebSocket client's
|
|
558
607
|
// `retrieve` returns `T | undefined` for a missing row; throwing only here
|
|
559
608
|
// made the obvious read ("does this row exist?") a hard edge that an agent
|
|
560
|
-
// had to wrap in try/catch. Both transports
|
|
561
|
-
// data. Callers branch on `.data` (
|
|
609
|
+
// had to wrap in try/catch. Both transports agree: an absent row means absent
|
|
610
|
+
// data. Callers branch on `.data` (the documented `.data?.x` usage).
|
|
562
611
|
// Normalize a miss to `undefined` (the server may send `null` or omit it).
|
|
563
612
|
const data = (query.data ?? undefined);
|
|
564
613
|
return {
|
|
@@ -568,16 +617,16 @@ export function createProtocolClient(options) {
|
|
|
568
617
|
};
|
|
569
618
|
}
|
|
570
619
|
/**
|
|
571
|
-
*
|
|
572
|
-
* that mirrors `ablo.<model>.create/update/delete`:
|
|
620
|
+
* A single-operation mutation over the model-scoped routes — the canonical
|
|
621
|
+
* surface that mirrors `ablo.<model>.create/update/delete`:
|
|
573
622
|
*
|
|
574
623
|
* POST /v1/models/:model create
|
|
575
624
|
* PATCH /v1/models/:model/:id update
|
|
576
625
|
* DELETE /v1/models/:model/:id delete
|
|
577
626
|
*
|
|
578
|
-
*
|
|
579
|
-
*
|
|
580
|
-
*
|
|
627
|
+
* The `commits.create(...)` resource remains the path for atomic
|
|
628
|
+
* multi-operation envelopes; this helper handles the one-operation,
|
|
629
|
+
* one-record case.
|
|
581
630
|
*/
|
|
582
631
|
async function mutateModel(action, modelName, id, data, options) {
|
|
583
632
|
assertWriteOptions(options && {
|
|
@@ -621,9 +670,8 @@ export function createProtocolClient(options) {
|
|
|
621
670
|
});
|
|
622
671
|
}
|
|
623
672
|
catch (error) {
|
|
624
|
-
//
|
|
625
|
-
//
|
|
626
|
-
// collisions here too; this single row IS the fallback target.
|
|
673
|
+
// The per-model write door (`ablo.<model>.update/create/delete`). Capture
|
|
674
|
+
// coordination collisions here too; this single row is the fallback target.
|
|
627
675
|
recordCoordinationConflict(error, clientTxId, [{ model: modelName, id }]);
|
|
628
676
|
throw error;
|
|
629
677
|
}
|
|
@@ -669,11 +717,25 @@ export function createProtocolClient(options) {
|
|
|
669
717
|
throw new AbloClaimedError(`Target ${name}/${params.id} is held; queued at position ${body.position ?? 0}. ` +
|
|
670
718
|
`The HTTP client cannot await the grant without a WebSocket.`, { code: 'claim_queued' });
|
|
671
719
|
}
|
|
672
|
-
// `claimId` is the queued
|
|
673
|
-
//
|
|
720
|
+
// `claimId` is the field name the queued response uses; check it alongside
|
|
721
|
+
// the other id shapes the response may carry.
|
|
674
722
|
return body.claim?.id ?? body.id ?? body.claimId ?? createClaimId();
|
|
675
723
|
};
|
|
676
724
|
const releaseClaim = (params) => requestJson(claimPath(isClaimHandle(params) ? params.target.id : params.id), { method: 'DELETE' }).then(() => undefined);
|
|
725
|
+
// One beat on the held lease. A lapsed lease answers `claim_lost`
|
|
726
|
+
// (409), which the wire error mapping surfaces as AbloClaimedError —
|
|
727
|
+
// the definitive signal that stops the auto-heartbeat loop.
|
|
728
|
+
const heartbeatClaim = async (id, claimId, options) => {
|
|
729
|
+
const reply = await requestJson(`${claimPath(id)}/heartbeat`, {
|
|
730
|
+
method: 'POST',
|
|
731
|
+
body: JSON.stringify({
|
|
732
|
+
claimId,
|
|
733
|
+
...(options.ttl !== undefined ? { ttl: options.ttl } : {}),
|
|
734
|
+
...(options.details !== undefined ? { details: options.details } : {}),
|
|
735
|
+
}),
|
|
736
|
+
});
|
|
737
|
+
return heldHeartbeatReply(reply, `claim ${claimId} on ${name}/${id}`);
|
|
738
|
+
};
|
|
677
739
|
async function claimImpl(params) {
|
|
678
740
|
const claimId = await acquireClaim(params);
|
|
679
741
|
observability?.captureClaim({
|
|
@@ -691,7 +753,33 @@ export function createProtocolClient(options) {
|
|
|
691
753
|
if (data === undefined) {
|
|
692
754
|
throw new AbloNotFoundError(`Cannot claim ${name}/${params.id}: it does not exist (or is outside this credential's scope).`, [params.id]);
|
|
693
755
|
}
|
|
694
|
-
const
|
|
756
|
+
const heartbeat = async (beatOptions) => {
|
|
757
|
+
const resolved = resolveHeartbeatOptions(beatOptions);
|
|
758
|
+
const beat = await heartbeatClaim(params.id, claimId, {
|
|
759
|
+
ttl: resolved.ttl ?? params.ttl,
|
|
760
|
+
...(resolved.details !== undefined
|
|
761
|
+
? { details: resolved.details }
|
|
762
|
+
: {}),
|
|
763
|
+
});
|
|
764
|
+
params.onHeartbeat?.(beat);
|
|
765
|
+
return beat;
|
|
766
|
+
};
|
|
767
|
+
// Opt-in auto-heartbeat — the background-worker cadence. The stateless
|
|
768
|
+
// HTTP claim defaults to the server's 60s acquire window when no TTL
|
|
769
|
+
// was requested, so the default cadence lands at 20s beats.
|
|
770
|
+
const stopHeartbeatLoop = params.heartbeat
|
|
771
|
+
? startClaimHeartbeatLoop({
|
|
772
|
+
beat: () => heartbeat(),
|
|
773
|
+
intervalMs: heartbeatCadenceMs(params.ttl !== undefined ? toMs(params.ttl) : 60_000, params.heartbeat),
|
|
774
|
+
...(params.onHeartbeatLost
|
|
775
|
+
? { onLost: params.onHeartbeatLost }
|
|
776
|
+
: {}),
|
|
777
|
+
})
|
|
778
|
+
: undefined;
|
|
779
|
+
const release = () => {
|
|
780
|
+
stopHeartbeatLoop?.();
|
|
781
|
+
return releaseClaim(params);
|
|
782
|
+
};
|
|
695
783
|
return {
|
|
696
784
|
object: 'claim',
|
|
697
785
|
id: claimId,
|
|
@@ -711,6 +799,7 @@ export function createProtocolClient(options) {
|
|
|
711
799
|
revoke: () => {
|
|
712
800
|
void release().catch(() => { });
|
|
713
801
|
},
|
|
802
|
+
heartbeat,
|
|
714
803
|
[Symbol.asyncDispose]: release,
|
|
715
804
|
};
|
|
716
805
|
}
|
|
@@ -729,8 +818,8 @@ export function createProtocolClient(options) {
|
|
|
729
818
|
reorder: async (params) => {
|
|
730
819
|
await requestJson(`${claimPath(params.id)}/reorder`, {
|
|
731
820
|
method: 'POST',
|
|
732
|
-
// The reorder route's payload is `{ heldBy, claimId }[]` — Claim's id
|
|
733
|
-
//
|
|
821
|
+
// The reorder route's payload is `{ heldBy, claimId }[]` — a Claim's id
|
|
822
|
+
// is the claimId.
|
|
734
823
|
body: JSON.stringify({ order: params.order.map((i) => ({ heldBy: i.heldBy, claimId: i.id })) }),
|
|
735
824
|
});
|
|
736
825
|
},
|
|
@@ -742,7 +831,13 @@ export function createProtocolClient(options) {
|
|
|
742
831
|
if (isClaimHandle(claimInput)) {
|
|
743
832
|
return run({ ...input, claimRef: { id: claimInput.id }, claim: undefined });
|
|
744
833
|
}
|
|
745
|
-
|
|
834
|
+
// `isClaimHandle` ruled out the handle form above; the generic mismatch
|
|
835
|
+
// (the union carries `Claim`, the guard narrows `Claim<T>`) keeps the
|
|
836
|
+
// compiler from subtracting it, so narrow to the inline-options form.
|
|
837
|
+
const claimId = await acquireClaim({
|
|
838
|
+
id,
|
|
839
|
+
...claimInput,
|
|
840
|
+
});
|
|
746
841
|
try {
|
|
747
842
|
return await run({ ...input, claimRef: { id: claimId }, claim: undefined });
|
|
748
843
|
}
|
|
@@ -796,8 +891,8 @@ export function createProtocolClient(options) {
|
|
|
796
891
|
// Confirm the write, then return the row — the obvious expectation of
|
|
797
892
|
// "create" (the WebSocket client already returns the row). The read-
|
|
798
893
|
// back is the authoritative server row, so it carries the framework
|
|
799
|
-
// defaults (createdAt
|
|
800
|
-
// an existing id, the
|
|
894
|
+
// defaults (createdAt, createdBy, …) and, for an idempotent re-create of
|
|
895
|
+
// an existing id, the existing row rather than the caller's input.
|
|
801
896
|
await mutateModel('create', name, id, params.data, {
|
|
802
897
|
...options,
|
|
803
898
|
wait: options?.wait ?? 'confirmed',
|
|
@@ -829,9 +924,9 @@ export function createProtocolClient(options) {
|
|
|
829
924
|
model,
|
|
830
925
|
sessions: {
|
|
831
926
|
async create(params) {
|
|
832
|
-
// Stateless mint: the configured key
|
|
833
|
-
// (no startup `rk_` exchange runs on this client).
|
|
834
|
-
// URL
|
|
927
|
+
// Stateless mint: the configured key is the control-plane credential here
|
|
928
|
+
// (no startup `rk_` exchange runs on this client). It reuses the resolved
|
|
929
|
+
// base URL and fetch; the shared `mintSession` handles the two server routes.
|
|
835
930
|
const apiKey = await resolveApiKeyValue(configuredApiKey);
|
|
836
931
|
if (!apiKey) {
|
|
837
932
|
throw new AbloAuthenticationError('sessions.create requires a secret (sk_) API key — call it from your backend, not the browser.', { code: 'apikey_missing' });
|
package/dist/client/auth.d.ts
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Authentication and URL resolution for the `Ablo()` client.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* sequence of named decisions rather than a stream of `??`-chains.
|
|
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.
|
|
9
8
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* explicit
|
|
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
13
|
*/
|
|
14
14
|
/**
|
|
15
|
-
* The credential-resolver callable
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* The credential-resolver callable type. It is defined alongside
|
|
16
|
+
* {@link createEndpointCredentialResolver} in `./credentialEndpoint` and
|
|
17
|
+
* re-exported here so importers of this module keep working. See that module
|
|
18
|
+
* for the full contract.
|
|
19
19
|
*/
|
|
20
20
|
import type { ApiKeySetter } from './credentialEndpoint.js';
|
|
21
21
|
export type { ApiKeySetter };
|
|
22
22
|
export interface AuthResolveInput {
|
|
23
23
|
/**
|
|
24
|
-
* The full options
|
|
25
|
-
*
|
|
26
|
-
*
|
|
24
|
+
* The full set of options the caller passed to the client constructor. Each
|
|
25
|
+
* resolver reads only the fields it needs; passing the whole object avoids
|
|
26
|
+
* threading many separate parameters through every helper.
|
|
27
27
|
*/
|
|
28
28
|
readonly options: {
|
|
29
29
|
readonly apiKey?: string | ApiKeySetter | null;
|
|
@@ -63,20 +63,21 @@ export interface CliKeyMismatch {
|
|
|
63
63
|
readonly kind: 'mode_mismatch' | 'key_override';
|
|
64
64
|
readonly message: string;
|
|
65
65
|
}
|
|
66
|
-
/** Infer sandbox
|
|
66
|
+
/** Infer the sandbox or production mode from an Ablo key's prefix. */
|
|
67
67
|
export declare function modeFromApiKey(key: string): CliMode | undefined;
|
|
68
68
|
export declare function describeCliKeyMismatch(configured: StaticApiKey, cli: CliCredentialSnapshot): CliKeyMismatch | null;
|
|
69
69
|
/**
|
|
70
|
-
*
|
|
70
|
+
* Resolves the Postgres connection string for the direct-connection option, or
|
|
71
|
+
* `null` when none was given.
|
|
71
72
|
*
|
|
72
|
-
* `databaseUrl` is
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
73
|
+
* `databaseUrl` is opt-in: the client registers a dedicated database only when
|
|
74
|
+
* the caller passes it explicitly. It is never read from
|
|
75
|
+
* `process.env.DATABASE_URL`, because this module treats `ABLO_API_KEY` as the
|
|
76
|
+
* one environment fallback — an app's `DATABASE_URL`, commonly set for other
|
|
77
|
+
* tools, must not silently switch the client into connection-string mode. The
|
|
78
|
+
* default path leaves `DATABASE_URL` untouched and reads through `dataSource(...)`
|
|
79
|
+
* instead, so this returns `null`. {@link warnIfDatabaseUrlEnvIgnored} nudges a
|
|
80
|
+
* caller who set the environment variable but omitted the option.
|
|
80
81
|
*/
|
|
81
82
|
export declare function resolveDatabaseUrl(input: AuthResolveInput): string | null;
|
|
82
83
|
export declare function warnIfDatabaseUrlEnvIgnored(input: AuthResolveInput, warn?: (message: string) => void): void;
|
|
@@ -84,17 +85,19 @@ export declare function warnIfDatabaseUrlDeprecated(input: AuthResolveInput, war
|
|
|
84
85
|
export declare function warnIfCliKeyMismatch(input: AuthResolveInput, warn?: (message: string) => void): Promise<void>;
|
|
85
86
|
export { ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
|
|
86
87
|
/**
|
|
87
|
-
*
|
|
88
|
-
* URLs pass through unchanged; only
|
|
88
|
+
* Normalizes older hosted host names to the current public API domain.
|
|
89
|
+
* Self-hosted or custom URLs pass through unchanged; only the retired
|
|
90
|
+
* first-party host names are rewritten.
|
|
89
91
|
*/
|
|
90
92
|
export declare function normalizeAbloHostedBaseUrl(rawUrl: string): string;
|
|
91
93
|
export declare function resolveBaseURL(input: AuthResolveInput): string;
|
|
92
94
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
95
|
+
* Guards against using a secret `apiKey` in a browser. A secret key is
|
|
96
|
+
* server-side only by default: shipping an `sk_live_...` key to a browser would
|
|
97
|
+
* expose it in every visitor's network tab. Callers opt in explicitly when the
|
|
98
|
+
* browser instead holds a minted session token (`ek_`/`rk_`) or routes through a
|
|
99
|
+
* server proxy. Throws {@link AbloAuthenticationError} when a secret key is
|
|
100
|
+
* detected in a browser without opt-in.
|
|
98
101
|
*/
|
|
99
102
|
export declare function assertBrowserSafety(input: {
|
|
100
103
|
apiKey: string | ApiKeySetter | null;
|
|
@@ -102,24 +105,21 @@ export declare function assertBrowserSafety(input: {
|
|
|
102
105
|
dangerouslyAllowBrowser: boolean | undefined;
|
|
103
106
|
}): void;
|
|
104
107
|
/**
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* between requests. Returns `null` when no key
|
|
108
|
-
*
|
|
109
|
-
* Mirrors Anthropic's pattern of supporting both a static string and
|
|
110
|
-
* a callable for credential rotation.
|
|
108
|
+
* Resolves an {@link ApiKeySetter} callable to its current string value, or
|
|
109
|
+
* returns a plain string key as-is. Called at request time so a rotating
|
|
110
|
+
* credential picks up new values between requests. Returns `null` when no key
|
|
111
|
+
* was configured.
|
|
111
112
|
*/
|
|
112
113
|
export declare function resolveApiKeyValue(apiKey: string | ApiKeySetter | null): Promise<string | null>;
|
|
113
114
|
/**
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
* so it lives here as a single source of truth.
|
|
115
|
+
* Translates a WebSocket URL into the matching HTTP API base URL, defaulting to
|
|
116
|
+
* `${url}/api` when the caller has not overridden `bootstrapBaseUrl`. The
|
|
117
|
+
* bootstrap helper, the hydration coordinator, the credential-exchange flow, and
|
|
118
|
+
* the identity flow all derive their base URL through this one function, so the
|
|
119
|
+
* derivation stays consistent across them.
|
|
120
120
|
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
121
|
+
* When both `wss://` and `https://` are valid, the ws-to-http rewrite preserves
|
|
122
|
+
* the protocol family: ws becomes http and wss becomes https.
|
|
123
123
|
*/
|
|
124
124
|
export declare function resolveBootstrapBaseUrl(input: {
|
|
125
125
|
readonly url: string;
|