@abloatai/ablo 0.25.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/AGENTS.md +5 -3
- package/CHANGELOG.md +34 -0
- package/README.md +104 -88
- package/dist/BaseSyncedStore.d.ts +140 -266
- package/dist/BaseSyncedStore.js +338 -739
- package/dist/Database.d.ts +62 -77
- package/dist/Database.js +106 -127
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +16 -15
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +52 -69
- package/dist/ModelRegistry.d.ts +46 -25
- package/dist/ModelRegistry.js +32 -30
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +6 -7
- package/dist/SyncClient.d.ts +119 -109
- package/dist/SyncClient.js +303 -224
- package/dist/SyncEngineContext.d.ts +1 -3
- package/dist/SyncEngineContext.js +1 -2
- 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 +39 -31
- package/dist/agent/Agent.js +35 -23
- 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} +30 -31
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +7 -8
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/credentialPolicy.d.ts +74 -71
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +7 -18
- package/dist/auth/credentialSource.js +10 -18
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +34 -40
- 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 +483 -369
- package/dist/client/Ablo.d.ts +107 -836
- package/dist/client/Ablo.js +174 -833
- package/dist/client/ApiClient.d.ts +44 -20
- package/dist/client/ApiClient.js +193 -44
- package/dist/client/auth.d.ts +51 -60
- package/dist/client/auth.js +137 -110
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +35 -0
- package/dist/client/consoleLogger.js +44 -0
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +158 -124
- package/dist/client/credentialEndpoint.d.ts +61 -0
- package/dist/client/credentialEndpoint.js +86 -0
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +21 -0
- package/dist/client/hostedEndpoints.js +21 -0
- package/dist/client/httpClient.d.ts +58 -54
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +49 -59
- package/dist/client/modelRegistration.d.ts +10 -0
- package/dist/client/modelRegistration.js +301 -0
- package/dist/client/options.d.ts +373 -0
- package/dist/client/options.js +6 -0
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +333 -0
- package/dist/client/resourceTypes.js +7 -0
- package/dist/client/schemaConfig.d.ts +44 -0
- package/dist/client/schemaConfig.js +176 -0
- package/dist/client/sessionMint.d.ts +17 -13
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +9 -10
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +28 -0
- package/dist/client/wsMutationExecutor.js +71 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -7
- package/dist/coordination/index.d.ts +13 -4
- package/dist/coordination/index.js +29 -4
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -11
- package/dist/coordination/trace.js +13 -15
- package/dist/core/DatabaseManager.d.ts +5 -8
- package/dist/core/DatabaseManager.js +38 -40
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +27 -34
- package/dist/core/QueryView.d.ts +17 -5
- package/dist/core/QueryView.js +6 -7
- package/dist/core/StoreManager.d.ts +14 -16
- package/dist/core/StoreManager.js +26 -25
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +18 -13
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +57 -54
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +145 -0
- package/dist/core/storeContract.js +12 -0
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +118 -101
- package/dist/errorCodes.js +277 -260
- package/dist/errors.d.ts +170 -165
- package/dist/errors.js +161 -151
- package/dist/index.d.ts +30 -27
- package/dist/index.js +90 -82
- package/dist/interfaces/index.d.ts +108 -133
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +59 -49
- 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 +149 -155
- package/dist/mutators/defineMutators.d.ts +24 -37
- 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 +105 -101
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +32 -16
- package/dist/query/client.js +103 -72
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +7 -11
- package/dist/react/AbloProvider.js +24 -17
- package/dist/react/context.d.ts +27 -146
- 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 +17 -15
- 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 +11 -12
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +9 -9
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +10 -4
- package/dist/react/useReactive.js +2 -3
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +3 -3
- 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 +35 -0
- package/dist/schema/ddlLock.js +46 -0
- 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 +36 -49
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +5 -4
- package/dist/schema/index.js +29 -21
- package/dist/schema/model.d.ts +121 -146
- package/dist/schema/model.js +24 -35
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +7 -1
- package/dist/schema/queries.d.ts +30 -32
- package/dist/schema/queries.js +24 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +38 -0
- package/dist/schema/residency.js +30 -0
- package/dist/schema/roles.d.ts +45 -27
- package/dist/schema/roles.js +52 -21
- package/dist/schema/schema.d.ts +36 -45
- package/dist/schema/schema.js +42 -39
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +36 -39
- 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} +27 -50
- 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 +31 -26
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +34 -28
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +28 -26
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +10 -9
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +27 -29
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +27 -19
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +30 -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 +94 -0
- package/dist/source/factory.js +268 -0
- package/dist/source/index.d.ts +10 -462
- package/dist/source/index.js +17 -421
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +10 -11
- package/dist/source/next.js +7 -8
- package/dist/source/pushQueue.d.ts +70 -48
- package/dist/source/pushQueue.js +36 -29
- package/dist/source/signing.d.ts +88 -0
- package/dist/source/signing.js +159 -0
- package/dist/source/types.d.ts +351 -0
- package/dist/source/types.js +43 -0
- package/dist/stores/ObjectStore.d.ts +11 -12
- package/dist/stores/ObjectStore.js +34 -35
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +8 -12
- package/dist/stores/SyncActionStore.js +77 -46
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +28 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
- package/dist/sync/ConnectionManager.d.ts +47 -50
- package/dist/sync/ConnectionManager.js +74 -70
- package/dist/sync/NetworkProbe.d.ts +27 -31
- package/dist/sync/NetworkProbe.js +67 -72
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
- package/dist/sync/SyncWebSocket.d.ts +175 -250
- package/dist/sync/SyncWebSocket.js +431 -769
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +38 -30
- package/dist/sync/bootstrapApply.d.ts +70 -0
- package/dist/sync/bootstrapApply.js +73 -0
- package/dist/sync/commitFrames.d.ts +44 -0
- package/dist/sync/commitFrames.js +94 -0
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +108 -25
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +13 -17
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +175 -0
- package/dist/sync/credentialLifecycle.js +322 -0
- package/dist/sync/deltaPipeline.d.ts +113 -0
- package/dist/sync/deltaPipeline.js +261 -0
- package/dist/sync/groupChange.d.ts +113 -0
- package/dist/sync/groupChange.js +242 -0
- package/dist/sync/heartbeat.d.ts +63 -0
- package/dist/sync/heartbeat.js +91 -0
- package/dist/sync/participants.d.ts +27 -27
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +40 -0
- package/dist/sync/syncCursor.js +55 -0
- package/dist/sync/syncPlan.d.ts +54 -0
- package/dist/sync/syncPlan.js +50 -0
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +116 -0
- package/dist/sync/wsFrameHandlers.js +374 -0
- package/dist/testing/fixtures/bootstrap.d.ts +21 -17
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +31 -34
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +12 -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 -18
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +4 -4
- package/dist/testing/index.js +3 -3
- 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 +21 -34
- package/dist/testing/mocks/MockSyncContext.js +16 -45
- package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +190 -221
- package/dist/transactions/TransactionQueue.js +424 -822
- package/dist/transactions/TransactionStore.d.ts +20 -0
- package/dist/transactions/TransactionStore.js +53 -0
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +58 -0
- package/dist/transactions/coalesceRules.js +140 -0
- package/dist/transactions/commitPayload.d.ts +130 -0
- package/dist/transactions/commitPayload.js +143 -0
- package/dist/transactions/deltaConfirmation.d.ts +58 -0
- package/dist/transactions/deltaConfirmation.js +215 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +99 -0
- package/dist/transactions/replayValidation.js +111 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +74 -80
- package/dist/types/index.js +22 -27
- package/dist/types/modelData.d.ts +10 -0
- package/dist/types/modelData.js +9 -0
- package/dist/types/participant.d.ts +20 -0
- package/dist/types/participant.js +10 -0
- package/dist/types/streams.d.ts +216 -209
- 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} +44 -100
- 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 +35 -27
- package/dist/wire/errorEnvelope.js +38 -32
- package/dist/wire/frames.d.ts +150 -67
- package/dist/wire/frames.js +48 -1
- package/dist/wire/index.d.ts +18 -13
- package/dist/wire/index.js +36 -13
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +38 -0
- package/dist/wire/protocol.js +38 -0
- package/dist/wire/protocolVersion.d.ts +60 -0
- package/dist/wire/protocolVersion.js +67 -0
- package/docs/api-keys.md +4 -3
- package/docs/coordination.md +59 -0
- package/docs/examples/existing-python-backend.md +3 -3
- package/docs/identity.md +4 -4
- package/docs/integration-guide.md +1 -1
- package/docs/react.md +1 -1
- package/docs/sessions.md +5 -7
- package/package.json +24 -21
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/client/index.d.ts +0 -36
- package/dist/client/index.js +0 -33
- package/dist/config/index.d.ts +0 -10
- package/dist/config/index.js +0 -12
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/interfaces/headless.d.ts +0 -95
- package/dist/interfaces/headless.js +0 -41
- package/dist/query/index.d.ts +0 -6
- package/dist/query/index.js +0 -5
- package/dist/realtime/index.d.ts +0 -10
- package/dist/realtime/index.js +0 -9
- package/dist/schema/plane.d.ts +0 -23
- package/dist/schema/plane.js +0 -19
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/next.d.ts +0 -51
- package/dist/server/next.js +0 -47
- 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 -1
- package/dist/server/storage-mode.js +0 -18
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/sync/OfflineFlush.d.ts +0 -9
- package/dist/sync/OfflineFlush.js +0 -22
- package/dist/sync/OfflineTransactionStore.d.ts +0 -37
- package/dist/sync/OfflineTransactionStore.js +0 -263
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/index.d.ts +0 -16
- package/dist/transactions/index.js +0 -7
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/errors.js
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* package should never reference an unpublished internal package from emitted
|
|
6
|
-
* JS; strict bundlers surface that immediately.
|
|
7
|
-
*
|
|
8
|
-
* ### Two patterns for consumers
|
|
2
|
+
* The typed error hierarchy for this package. Every error the SDK throws is an
|
|
3
|
+
* {@link AbloError} or one of its subclasses, so a consumer can catch broadly or
|
|
4
|
+
* narrowly. There are two equivalent ways to tell errors apart:
|
|
9
5
|
*
|
|
10
6
|
* ```ts
|
|
11
|
-
* //
|
|
7
|
+
* // By class, with instanceof
|
|
12
8
|
* if (err instanceof AbloRateLimitError) backoff(err.retryAfterSeconds);
|
|
13
9
|
*
|
|
14
|
-
* //
|
|
15
|
-
* //
|
|
10
|
+
* // By discriminator string, for cases where class identity is lost —
|
|
11
|
+
* // for example after an error crosses a web worker boundary
|
|
16
12
|
* if (err.type === 'AbloRateLimitError') { ... }
|
|
17
13
|
* ```
|
|
18
14
|
*
|
|
@@ -23,37 +19,41 @@ import { errorCodeSpec, classifyRecovery } from './errorCodes.js';
|
|
|
23
19
|
import { wireClaimSummarySchema, descriptionFromMeta, } from './coordination/schema.js';
|
|
24
20
|
export { ERROR_CODES, ERROR_CONTRACT_VERSION, errorCodeSpec, isRetryableCode, classifyRecovery, recoveryClassSchema, RECOVERY_CLASSES, } from './errorCodes.js';
|
|
25
21
|
// ── AbloError hierarchy — the typed error surface ────────────────────
|
|
26
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* The base class for every error this SDK throws. It carries the fields common
|
|
24
|
+
* to all of them — a {@link type} discriminator, an optional stable {@link code},
|
|
25
|
+
* and optional HTTP and diagnostic metadata — and defines the shared JSON and
|
|
26
|
+
* string serialization. Every other error class extends it.
|
|
27
|
+
*/
|
|
27
28
|
export class AbloError extends Error {
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
29
|
+
/** A discriminator string equal to the class name. Switch on `error.type` to
|
|
30
|
+
* distinguish error kinds when `instanceof` is unreliable, such as after an
|
|
31
|
+
* error has crossed a serialization boundary. */
|
|
31
32
|
type = 'AbloError';
|
|
32
|
-
/**
|
|
33
|
-
* {@link ErrorCode} registry —
|
|
34
|
-
* `'capability_scope_denied'
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
33
|
+
/** A stable, machine-readable identifier for the error, drawn from the
|
|
34
|
+
* {@link ErrorCode} registry — for example `'apikey_invalid'` or
|
|
35
|
+
* `'capability_scope_denied'` — suitable for logs, metrics, and `switch`
|
|
36
|
+
* handling. It is typed as a plain `string` rather than {@link ErrorCode} so
|
|
37
|
+
* this client can still surface a code from a newer server that it does not
|
|
38
|
+
* yet recognize; code producers are constrained at the constructor instead. */
|
|
38
39
|
code;
|
|
39
|
-
/** HTTP status code when the error originated from an HTTP response. */
|
|
40
|
+
/** HTTP status code, when the error originated from an HTTP response. */
|
|
40
41
|
httpStatus;
|
|
41
|
-
/**
|
|
42
|
-
* `x-request-id
|
|
42
|
+
/** A correlation id for tracing a request through the server, present when the
|
|
43
|
+
* server returned one on the `x-request-id` header. Include it in support
|
|
44
|
+
* requests. */
|
|
43
45
|
requestId;
|
|
44
|
-
/**
|
|
45
|
-
* `'dataroomMember.grants.subject'
|
|
46
|
-
*
|
|
46
|
+
/** The specific input that caused the error, as a model or field path such as
|
|
47
|
+
* `'dataroomMember.grants.subject'`, so tooling can point at the exact
|
|
48
|
+
* offending value. */
|
|
47
49
|
param;
|
|
48
|
-
/**
|
|
49
|
-
*
|
|
50
|
+
/** A link to the documentation for this error's {@link code}. When not set
|
|
51
|
+
* explicitly, it is derived from the code by {@link docUrlForCode}. */
|
|
50
52
|
docUrl;
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
* conflicting rows.
|
|
54
|
-
*
|
|
55
|
-
* structured error keeps its detail through `toJSON` instead of being
|
|
56
|
-
* flattened to a bare message. */
|
|
53
|
+
/** Extra structured data specific to this error, merged into the serialized
|
|
54
|
+
* envelope — for example a schema push's `{ warnings, unexecutable }`, or the
|
|
55
|
+
* conflicting rows of a stale write. This detail is preserved through
|
|
56
|
+
* {@link toJSON} rather than flattened into the message. */
|
|
57
57
|
details;
|
|
58
58
|
constructor(message, options) {
|
|
59
59
|
super(message);
|
|
@@ -76,9 +76,10 @@ export class AbloError extends Error {
|
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
/**
|
|
79
|
-
*
|
|
80
|
-
* doc_url, request_id }
|
|
81
|
-
*
|
|
79
|
+
* Serializes the error to its wire shape: `{ type, code, param, message,
|
|
80
|
+
* doc_url, request_id }`, with any {@link details} merged in. This is the same
|
|
81
|
+
* JSON shape the SDK uses across HTTP bodies, WebSocket frames, and logs, so a
|
|
82
|
+
* consumer parses every Ablo error the same way.
|
|
82
83
|
*/
|
|
83
84
|
toJSON() {
|
|
84
85
|
return {
|
|
@@ -92,12 +93,13 @@ export class AbloError extends Error {
|
|
|
92
93
|
};
|
|
93
94
|
}
|
|
94
95
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
96
|
+
* Formats the error as a single line for logs and string interpolation:
|
|
97
|
+
* `AbloValidationError [code]: message (see docs) [request_id: …]`.
|
|
97
98
|
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
* payload
|
|
99
|
+
* It intentionally omits {@link details}, the cause, and the stack, which are
|
|
100
|
+
* what turn a logged rich error into an unreadable wall of text. The full
|
|
101
|
+
* structured payload remains available through {@link toJSON}; this is the
|
|
102
|
+
* concise human-readable form.
|
|
101
103
|
*/
|
|
102
104
|
toString() {
|
|
103
105
|
const code = this.code ? ` [${this.code}]` : '';
|
|
@@ -107,9 +109,9 @@ export class AbloError extends Error {
|
|
|
107
109
|
}
|
|
108
110
|
}
|
|
109
111
|
/**
|
|
110
|
-
*
|
|
111
|
-
* lives, so every error
|
|
112
|
-
*
|
|
112
|
+
* Builds the documentation URL for a stable error {@link ErrorCode}. This is the
|
|
113
|
+
* single place the URL convention lives, so every error that carries a code gets
|
|
114
|
+
* a `doc_url` automatically.
|
|
113
115
|
*/
|
|
114
116
|
export function docUrlForCode(code) {
|
|
115
117
|
return `https://docs.abloatai.com/errors#${code}`;
|
|
@@ -147,11 +149,11 @@ export class AbloValidationError extends AbloError {
|
|
|
147
149
|
type = 'AbloValidationError';
|
|
148
150
|
}
|
|
149
151
|
/**
|
|
150
|
-
*
|
|
151
|
-
* caller's
|
|
152
|
-
* the typed resource
|
|
153
|
-
*
|
|
154
|
-
*
|
|
152
|
+
* An update or delete addressed a row that does not exist, or lies outside the
|
|
153
|
+
* caller's organization (HTTP 404). Such targets are reported on
|
|
154
|
+
* {@link CommitReceipt.missingIds}, and the typed resource methods raise this
|
|
155
|
+
* error rather than returning a successful receipt for a write that quietly
|
|
156
|
+
* matched zero rows. The absent ids are carried on {@link missingIds}.
|
|
155
157
|
*/
|
|
156
158
|
export class AbloNotFoundError extends AbloError {
|
|
157
159
|
type = 'AbloNotFoundError';
|
|
@@ -172,15 +174,13 @@ export class AbloServerError extends AbloError {
|
|
|
172
174
|
type = 'AbloServerError';
|
|
173
175
|
}
|
|
174
176
|
/**
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
* response is to re-read
|
|
177
|
+
* A write carried a `readAt` watermark, but the target row has changed since
|
|
178
|
+
* that point (HTTP 409). The snapshot the caller reasoned from is stale, so the
|
|
179
|
+
* safe response is to re-read the row and regenerate the write.
|
|
178
180
|
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
* regeneration (only re-think the slides that changed, not the whole
|
|
183
|
-
* deck).
|
|
181
|
+
* {@link conflicts} lists the specific model-and-id pairs that changed during
|
|
182
|
+
* the window between the read and the write, which lets a caller regenerate only
|
|
183
|
+
* the rows that actually moved rather than everything.
|
|
184
184
|
*/
|
|
185
185
|
export class AbloStaleContextError extends AbloError {
|
|
186
186
|
type = 'AbloStaleContextError';
|
|
@@ -197,16 +197,15 @@ export class AbloStaleContextError extends AbloError {
|
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
/**
|
|
200
|
-
* The functional `update(id, current => next)` form
|
|
201
|
-
* budget
|
|
202
|
-
* concurrent writes
|
|
200
|
+
* The functional `update(id, current => next)` form gave up after exhausting its
|
|
201
|
+
* reconcile budget, because the row stayed continuously contended under
|
|
202
|
+
* sustained concurrent writes and no attempt could land its compare-and-swap.
|
|
203
203
|
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
* last underlying conflict that drove the final retry is on `.cause`.
|
|
204
|
+
* The SDK reaches this only at the extreme: it has already re-read, recomputed,
|
|
205
|
+
* and retried on every intervening conflict on the caller's behalf. Catch it to
|
|
206
|
+
* back off and retry later, raise the `retries` budget, or move the row to the
|
|
207
|
+
* WebSocket transport, which queues writers fairly instead of racing them. The
|
|
208
|
+
* last underlying conflict is available on `cause`.
|
|
210
209
|
*/
|
|
211
210
|
export class AbloContentionError extends AbloError {
|
|
212
211
|
type = 'AbloContentionError';
|
|
@@ -290,18 +289,17 @@ export class AbloClaimedError extends AbloError {
|
|
|
290
289
|
}
|
|
291
290
|
}
|
|
292
291
|
/**
|
|
293
|
-
*
|
|
294
|
-
* absent parts
|
|
295
|
-
*
|
|
292
|
+
* Builds a human-readable label for a claim target by joining its `model`, `id`,
|
|
293
|
+
* and `field` with `/`, omitting any absent parts and falling back to `'target'`
|
|
294
|
+
* when none are present.
|
|
296
295
|
*/
|
|
297
296
|
export function claimTargetLabel(target) {
|
|
298
297
|
return [target.model, target.id, target.field].filter(Boolean).join('/') || 'target';
|
|
299
298
|
}
|
|
300
299
|
/**
|
|
301
|
-
*
|
|
302
|
-
*
|
|
303
|
-
*
|
|
304
|
-
* holder whose metadata shapes the message.
|
|
300
|
+
* Builds the {@link AbloClaimedError} for a write that was rejected because the
|
|
301
|
+
* row is claimed. The first entry in `claims` is treated as the current holder,
|
|
302
|
+
* and its metadata shapes the error message.
|
|
305
303
|
*/
|
|
306
304
|
export function claimedError(target, claims, code) {
|
|
307
305
|
const label = claimTargetLabel(target);
|
|
@@ -314,18 +312,17 @@ export function claimedError(target, claims, code) {
|
|
|
314
312
|
}), { code, claims });
|
|
315
313
|
}
|
|
316
314
|
/**
|
|
317
|
-
* A scoped credential was denied
|
|
318
|
-
* expired (`capability_invalid`), or the connection's
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
* Extends `AbloPermissionError` so existing `instanceof CapabilityError`
|
|
324
|
-
* checks keep working AND broader `instanceof AbloPermissionError`
|
|
325
|
-
* matches for consumers who don't care about the scope specifics.
|
|
315
|
+
* A scoped credential was denied, either because the key is unknown, revoked, or
|
|
316
|
+
* expired (`capability_invalid`), or because the connection's scope does not
|
|
317
|
+
* cover the attempted action (`capability_scope_denied`). For restricted (`rk_`)
|
|
318
|
+
* API keys this is a server-side check against the key's granted sync groups and
|
|
319
|
+
* operations.
|
|
326
320
|
*
|
|
327
|
-
*
|
|
328
|
-
*
|
|
321
|
+
* It extends {@link AbloPermissionError}, so it is caught both by code that
|
|
322
|
+
* specifically checks for `CapabilityError` and by code that only distinguishes
|
|
323
|
+
* the broader permission category. When present, {@link requiredCapability}
|
|
324
|
+
* describes the scope a key would need to carry for the request to succeed on
|
|
325
|
+
* retry.
|
|
329
326
|
*/
|
|
330
327
|
export class CapabilityError extends AbloPermissionError {
|
|
331
328
|
requiredCapability;
|
|
@@ -339,15 +336,12 @@ export class CapabilityError extends AbloPermissionError {
|
|
|
339
336
|
}
|
|
340
337
|
// ── Legacy session error (now part of the typed hierarchy) ───────────
|
|
341
338
|
/**
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
* rather than showing a generic retry option.
|
|
339
|
+
* Thrown when the login session itself is invalid or expired, signaling that the
|
|
340
|
+
* user should be sent to sign in again rather than offered a generic retry.
|
|
345
341
|
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
* (`instanceof AbloAuthenticationError` / `e.type === 'AbloAuthenticationError'`)
|
|
350
|
-
* now sees session failures too.
|
|
342
|
+
* It extends {@link AbloAuthenticationError}, so it is caught both by code using
|
|
343
|
+
* the {@link SyncSessionError.isSessionError} check and by code that catches the
|
|
344
|
+
* authentication category in general.
|
|
351
345
|
*/
|
|
352
346
|
export class SyncSessionError extends AbloAuthenticationError {
|
|
353
347
|
isSessionError = true;
|
|
@@ -361,44 +355,59 @@ export class SyncSessionError extends AbloAuthenticationError {
|
|
|
361
355
|
}
|
|
362
356
|
}
|
|
363
357
|
/**
|
|
364
|
-
*
|
|
358
|
+
* Returns true when a value is a {@link SyncSessionError}, or any error-like
|
|
359
|
+
* object that reports itself as a session error through an `isSessionError`
|
|
360
|
+
* flag.
|
|
365
361
|
*/
|
|
366
362
|
static isSessionError(error) {
|
|
367
363
|
if (error instanceof SyncSessionError) {
|
|
368
364
|
return true;
|
|
369
365
|
}
|
|
370
366
|
if (error && typeof error === 'object' && 'isSessionError' in error) {
|
|
371
|
-
return error.isSessionError
|
|
367
|
+
return error.isSessionError;
|
|
372
368
|
}
|
|
373
369
|
return false;
|
|
374
370
|
}
|
|
375
371
|
/**
|
|
376
|
-
*
|
|
372
|
+
* Determines whether an HTTP response means the login session has expired and
|
|
373
|
+
* the user should sign in again. When the body carries a structured Ablo error
|
|
374
|
+
* code, the decision is made from that code's recovery class; otherwise a bare
|
|
375
|
+
* 401 is treated as an expiry and a 403 is not.
|
|
377
376
|
*/
|
|
378
377
|
static isSessionErrorResponse(status, body) {
|
|
379
|
-
//
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
//
|
|
383
|
-
// behaviourally identical to the old `session_expired || jwt_expired` list.
|
|
378
|
+
// Sign the user out only for a genuine expiry of the long-lived login
|
|
379
|
+
// (`recovery: 'session_expiry'`). The decision runs through the recovery
|
|
380
|
+
// classification rather than a hardcoded list, so the access-versus-session
|
|
381
|
+
// split lives in one place.
|
|
384
382
|
//
|
|
385
|
-
//
|
|
386
|
-
//
|
|
387
|
-
//
|
|
388
|
-
//
|
|
389
|
-
// `permission` failures
|
|
390
|
-
//
|
|
391
|
-
// bounce to /signin").
|
|
383
|
+
// It deliberately does not fire for `access_credential_expiry`
|
|
384
|
+
// (`apikey_expired`): an expired short-lived key is re-mintable from the
|
|
385
|
+
// still-valid login and must not sign the user out — the connection layer
|
|
386
|
+
// re-mints it instead. It also does not fire for `auth_blocked` or
|
|
387
|
+
// `permission` failures, where re-authenticating would present the same
|
|
388
|
+
// rejected credential and loop.
|
|
392
389
|
const code = extractWireCode(body);
|
|
393
390
|
if (code) {
|
|
394
391
|
return classifyRecovery(code) === 'session_expiry';
|
|
395
392
|
}
|
|
396
|
-
//
|
|
397
|
-
//
|
|
398
|
-
// permission failure
|
|
393
|
+
// With no structured code (a bare body or a non-Ablo proxy response), treat
|
|
394
|
+
// a 401 as an expiry that drives re-authentication, and a 403 as a
|
|
395
|
+
// permission failure rather than a session error.
|
|
399
396
|
return status === 401;
|
|
400
397
|
}
|
|
401
398
|
}
|
|
399
|
+
/**
|
|
400
|
+
* The WebSocket-close counterpart to {@link SyncSessionError.isSessionErrorResponse}:
|
|
401
|
+
* returns true for close reasons that mean the short-lived access credential
|
|
402
|
+
* (`ek_` or `rk_`) has expired. The server closes such sockets with code 4001
|
|
403
|
+
* and reason `'credential_expired'`. Because the credential is re-mintable from
|
|
404
|
+
* the still-valid login, the connection layer re-mints it and reconnects rather
|
|
405
|
+
* than signing the user out or clearing local data. Every other session close
|
|
406
|
+
* reason, such as a revoked key or a genuinely lost login, stays terminal.
|
|
407
|
+
*/
|
|
408
|
+
export function isAccessCredentialExpiryCloseReason(reason) {
|
|
409
|
+
return reason === 'credential_expired' || classifyRecovery(reason) === 'access_credential_expiry';
|
|
410
|
+
}
|
|
402
411
|
// ── HTTP → class mapping ──────────────────────────────────────────────
|
|
403
412
|
const OptionalWireStringSchema = z.preprocess((value) => (typeof value === 'string' ? value : undefined), z.string().optional());
|
|
404
413
|
const RequiredCapabilityWireSchema = z
|
|
@@ -432,8 +441,8 @@ const ErrorFieldSchema = z
|
|
|
432
441
|
.catch(undefined);
|
|
433
442
|
const ErrorBodyShapeSchema = z
|
|
434
443
|
.object({
|
|
435
|
-
/**
|
|
436
|
-
*
|
|
444
|
+
/** The `error` field may be a flat code string, as some endpoints return,
|
|
445
|
+
* or a nested error object, as a {@link CommitReceipt} carries. */
|
|
437
446
|
error: ErrorFieldSchema,
|
|
438
447
|
code: OptionalWireStringSchema,
|
|
439
448
|
reason: OptionalWireStringSchema,
|
|
@@ -452,16 +461,16 @@ function parseErrorBodyShape(body) {
|
|
|
452
461
|
return parsed.success ? parsed.data : {};
|
|
453
462
|
}
|
|
454
463
|
/**
|
|
455
|
-
*
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
*
|
|
459
|
-
*
|
|
464
|
+
* Coerces any thrown value into an {@link AbloError}, so a consumer never catches
|
|
465
|
+
* an untyped error from the SDK. An error that is already an {@link AbloError}
|
|
466
|
+
* passes through unchanged, preserving its subclass, `code`, and `httpStatus`; a
|
|
467
|
+
* plain `Error` keeps its message and is retained as the `cause` (carrying any
|
|
468
|
+
* `code` attached to it); anything else is stringified.
|
|
460
469
|
*
|
|
461
|
-
*
|
|
462
|
-
*
|
|
463
|
-
*
|
|
464
|
-
*
|
|
470
|
+
* The SDK applies this at its public async boundaries so that `instanceof
|
|
471
|
+
* AbloError` and `error.type` hold for whatever a consumer catches, no matter
|
|
472
|
+
* which internal layer — transport, local storage, bootstrap, or a third-party
|
|
473
|
+
* throw — produced the original error.
|
|
465
474
|
*/
|
|
466
475
|
export function toAbloError(err) {
|
|
467
476
|
if (err instanceof AbloError)
|
|
@@ -474,16 +483,15 @@ export function toAbloError(err) {
|
|
|
474
483
|
return new AbloError(String(err), { cause: err });
|
|
475
484
|
}
|
|
476
485
|
/**
|
|
477
|
-
*
|
|
478
|
-
* single code
|
|
479
|
-
* request
|
|
480
|
-
*
|
|
486
|
+
* Builds the appropriate typed {@link AbloError} from a wire error. This is the
|
|
487
|
+
* single code-to-class mapping shared by every transport that can reject a
|
|
488
|
+
* request — HTTP responses through {@link translateHttpError}, WebSocket result
|
|
489
|
+
* frames, and agent-job receipts.
|
|
481
490
|
*
|
|
482
|
-
*
|
|
483
|
-
* canonical
|
|
484
|
-
*
|
|
485
|
-
*
|
|
486
|
-
* hierarchy and loses `code`/`httpStatus`/retryability.
|
|
491
|
+
* It decides by code first, then by status. Because a known {@link ErrorCode}
|
|
492
|
+
* carries its canonical HTTP status in the registry, a transport that has no
|
|
493
|
+
* status of its own (such as the WebSocket commit path) still produces the right
|
|
494
|
+
* subclass, with its `code`, status, and retryability intact.
|
|
487
495
|
*/
|
|
488
496
|
export function errorFromWire(message, opts = {}) {
|
|
489
497
|
const { code, requestId, requiredCapability, claims } = opts;
|
|
@@ -503,9 +511,13 @@ export function errorFromWire(message, opts = {}) {
|
|
|
503
511
|
return new CapabilityError(code, message, requiredCapability);
|
|
504
512
|
}
|
|
505
513
|
// Claim enforcement (rides 409): the target entity is held by another
|
|
506
|
-
// participant
|
|
507
|
-
//
|
|
508
|
-
|
|
514
|
+
// participant, or a lease this participant held is gone (`claim_lost` —
|
|
515
|
+
// the answer a heartbeat gets after its lease lapsed). Discriminate on
|
|
516
|
+
// code BEFORE the generic 409→idempotency mapping so claim outcomes
|
|
517
|
+
// surface as AbloClaimedError on every transport.
|
|
518
|
+
if (code === 'claim_conflict' ||
|
|
519
|
+
code === 'entity_claimed' ||
|
|
520
|
+
code === 'claim_lost') {
|
|
509
521
|
return new AbloClaimedError(message, { ...baseOpts, claims });
|
|
510
522
|
}
|
|
511
523
|
// A write whose `readAt` watermark went stale — callers re-read and retry.
|
|
@@ -528,13 +540,11 @@ export function errorFromWire(message, opts = {}) {
|
|
|
528
540
|
return new AbloError(message, baseOpts);
|
|
529
541
|
}
|
|
530
542
|
/**
|
|
531
|
-
*
|
|
532
|
-
*
|
|
533
|
-
*
|
|
534
|
-
*
|
|
535
|
-
*
|
|
536
|
-
* the actual class selection to {@link errorFromWire} (shared with the
|
|
537
|
-
* frame transports) after extracting code/message from the HTTP body.
|
|
543
|
+
* Translates an HTTP response into the appropriate typed {@link AbloError}. This
|
|
544
|
+
* is the single mapping every request path routes a non-2xx response through, so
|
|
545
|
+
* the error a consumer sees is always the right subclass. After extracting the
|
|
546
|
+
* code and message from the response body, it delegates the class selection to
|
|
547
|
+
* {@link errorFromWire}, the same logic the frame transports use.
|
|
538
548
|
*/
|
|
539
549
|
export function translateHttpError(status, body, requestId) {
|
|
540
550
|
const parsed = parseErrorBodyShape(body);
|
|
@@ -565,12 +575,12 @@ export function translateHttpError(status, body, requestId) {
|
|
|
565
575
|
});
|
|
566
576
|
}
|
|
567
577
|
/**
|
|
568
|
-
*
|
|
569
|
-
* — a top-level `code`, a nested `error.code`, or a string `error`.
|
|
570
|
-
*
|
|
571
|
-
*
|
|
572
|
-
*
|
|
573
|
-
*
|
|
578
|
+
* Reports whether an HTTP error body carries a code that {@link translateHttpError}
|
|
579
|
+
* can read — a top-level `code`, a nested `error.code`, or a string `error`. A
|
|
580
|
+
* caller that has a meaningful fallback code uses this to choose between routing
|
|
581
|
+
* a structured body through {@link translateHttpError} and throwing its own typed
|
|
582
|
+
* error with the fallback when the body is bare, rather than producing an error
|
|
583
|
+
* with no code.
|
|
574
584
|
*/
|
|
575
585
|
export function hasWireCode(body) {
|
|
576
586
|
const parsed = parseErrorBodyShape(body);
|
|
@@ -583,10 +593,10 @@ export function hasWireCode(body) {
|
|
|
583
593
|
typeof parsed.error.code === 'string');
|
|
584
594
|
}
|
|
585
595
|
/**
|
|
586
|
-
*
|
|
587
|
-
* top-level `code` or a nested `error.code
|
|
588
|
-
* code-less
|
|
589
|
-
*
|
|
596
|
+
* Extracts the canonical error `code` from a raw HTTP error body string — the
|
|
597
|
+
* top-level `code` or a nested `error.code` — returning `undefined` for a
|
|
598
|
+
* non-JSON or code-less body. Session-error detection uses it to tell a genuine
|
|
599
|
+
* session expiry apart from other authentication failures.
|
|
590
600
|
*/
|
|
591
601
|
export function extractWireCode(body) {
|
|
592
602
|
if (!body)
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @abloatai/ablo —
|
|
2
|
+
* @abloatai/ablo — the collaboration layer for AI agents and people.
|
|
3
3
|
*
|
|
4
4
|
* ```ts
|
|
5
5
|
* import Ablo from '@abloatai/ablo';
|
|
@@ -14,38 +14,41 @@
|
|
|
14
14
|
* type Entry = Ablo.Peer;
|
|
15
15
|
* ```
|
|
16
16
|
*
|
|
17
|
-
* `Ablo({ schema, apiKey })`
|
|
18
|
-
*
|
|
19
|
-
* runtimes.
|
|
17
|
+
* `Ablo({ schema, apiKey })` returns typed model clients. `Ablo({ apiKey })`
|
|
18
|
+
* returns the stateless HTTP model and commit client, which suits agents, MCP
|
|
19
|
+
* route handlers, and custom runtimes.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
21
|
+
* The whole package reaches you through one name: `Ablo` is at once a factory
|
|
22
|
+
* function, a type, and a namespace. You call model clients with dot access on
|
|
23
|
+
* the instance (`ablo.reports.retrieve(...)`) and reach every supporting type
|
|
24
|
+
* through the namespace (`Ablo.Peer`, `Ablo.Claim`).
|
|
23
25
|
*
|
|
24
|
-
*
|
|
26
|
+
* Related surfaces live on their own import subpaths:
|
|
25
27
|
* @abloatai/ablo/schema — defineSchema, model, z (Zod)
|
|
26
28
|
* @abloatai/ablo/react — <AbloProvider>, useQuery, useMutate
|
|
27
|
-
* @abloatai/ablo/testing — test harnesses
|
|
29
|
+
* @abloatai/ablo/testing — test harnesses and fixtures
|
|
28
30
|
*
|
|
29
|
-
* Reads
|
|
30
|
-
* `.list({ where })` are
|
|
31
|
-
* the
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
31
|
+
* Reads come in two flavors, distinguished by where the data is fetched from.
|
|
32
|
+
* `ablo.<model>.retrieve({ id })` and `.list({ where })` are asynchronous reads
|
|
33
|
+
* that consult the local cache first and fall back to the network, de-duplicating
|
|
34
|
+
* concurrent requests for the same row. They are the default, and the right
|
|
35
|
+
* choice for stateless callers whose local graph starts empty.
|
|
36
|
+
* `ablo.<model>.get(id)`, `.getAll(...)`, and `.getCount(...)` are synchronous
|
|
37
|
+
* snapshots of the already-loaded local graph with no network round-trip — use
|
|
38
|
+
* them in reactive React selectors (`useAblo((ablo) => ablo.<model>.get(id))`)
|
|
39
|
+
* once the graph is warm.
|
|
36
40
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* • the `Ablo*Error` classes
|
|
41
|
-
* That's it. If you're reaching past those, you're in advanced territory.
|
|
41
|
+
* What to import, in short:
|
|
42
|
+
* • `Ablo` (the default export), `AbloOptions`, and the `Model*Params` option
|
|
43
|
+
* bags cover what most applications and agents ever need.
|
|
44
|
+
* • the `Ablo*Error` classes let you discriminate failures in catch blocks.
|
|
42
45
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* • `dataSource` / `abloSource` —
|
|
46
|
-
* • `defaultPolicy` —
|
|
47
|
-
* • `defineMutators` / `createTransaction` —
|
|
48
|
-
* If you don't recognize one, you don't need it
|
|
46
|
+
* A handful of exports are for advanced use and are marked "Advanced" at their
|
|
47
|
+
* declaration below, each with the one situation it is for:
|
|
48
|
+
* • `dataSource` / `abloSource` — when your own database stays canonical.
|
|
49
|
+
* • `defaultPolicy` — when you customize conflict resolution.
|
|
50
|
+
* • `defineMutators` / `createTransaction` — when you write custom mutators.
|
|
51
|
+
* If you don't recognize one of these, you don't need it.
|
|
49
52
|
*/
|
|
50
53
|
export { Ablo } from './client/Ablo.js';
|
|
51
54
|
export type { MutationExecutor } from './interfaces/index.js';
|
|
@@ -54,7 +57,7 @@ export { DEFAULT_CONTENTION_RETRIES } from './client/functionalUpdate.js';
|
|
|
54
57
|
export type { HttpClaimApi, InternalAbloOptions } from './client/Ablo.js';
|
|
55
58
|
export { type AbloHttpClientOptions, type AbloHttpClient, type HttpModelClient, } from './client/httpClient.js';
|
|
56
59
|
export { ABLO_DEFAULT_BASE_URL, ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, normalizeAbloHostedBaseUrl, } from './client/auth.js';
|
|
57
|
-
export type { AbloOptions, LocalCountOptions, LocalReadOptions, ModelListScope, ServerReadOptions, ModelRetrieveParams, ModelCreateParams, ModelUpdateParams, ModelDeleteParams, ClaimOptions, ClaimParams, ClaimLookupParams, ClaimReorderParams, Claim, HeldClaim, ModelOperations, } from './client/Ablo.js';
|
|
60
|
+
export type { AbloOptions, LocalCountOptions, LocalReadOptions, ModelListScope, ServerReadOptions, ModelRetrieveParams, ModelCreateParams, ModelUpdateParams, ModelDeleteParams, ClaimOptions, ClaimParams, ClaimLookupParams, ClaimReorderParams, Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, ModelOperations, } from './client/Ablo.js';
|
|
58
61
|
export type { AbloPersistence } from './client/persistence.js';
|
|
59
62
|
import { Ablo } from './client/Ablo.js';
|
|
60
63
|
export default Ablo;
|