@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,126 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The conflict types a policy decides on. The engine detects a conflict and
|
|
3
|
-
* hands it to your {@link ConflictPolicy}, which returns a
|
|
4
|
-
* {@link ConflictDecision}.
|
|
5
|
-
*
|
|
6
|
-
* There are two conflict shapes. A {@link StaleContextConflict} is a write
|
|
7
|
-
* whose `readAt` watermark is older than the latest delta on the target row. A
|
|
8
|
-
* {@link ClaimHeldConflict} is a participant trying to claim a target that
|
|
9
|
-
* someone else already holds. {@link Conflict} is the discriminated union of
|
|
10
|
-
* the two; switch on `kind` to narrow it.
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* The conflict policy the engine uses when you do not supply your own. It
|
|
14
|
-
* favors people: a human is never blocked, while agents and automated writers
|
|
15
|
-
* yield to a claim someone else holds.
|
|
16
|
-
*
|
|
17
|
-
* For a `claim_held` conflict, the decision follows the committer's kind:
|
|
18
|
-
*
|
|
19
|
-
* • `user` → `allow` — a human is never blocked by a claim. A claim is a
|
|
20
|
-
* coordination hint among agents, not a lock on
|
|
21
|
-
* people.
|
|
22
|
-
* • `agent` → `reject` — an agent yields to a claim held by someone else.
|
|
23
|
-
* The one sanctioned exception is the privileged
|
|
24
|
-
* `claim.preempt` capability; see
|
|
25
|
-
* {@link capabilityPreemptPolicy}.
|
|
26
|
-
* • `system` → `reject` — automated and backend writers serialize through
|
|
27
|
-
* claims the same way agents do, so a server job
|
|
28
|
-
* cannot silently overwrite a held row. Declare the
|
|
29
|
-
* model's conflict axis to overwrite if you want that.
|
|
30
|
-
*
|
|
31
|
-
* Allowing only `user` by default is deliberate: a backend key is a
|
|
32
|
-
* full-access credential, and claim serialization depends on those writers
|
|
33
|
-
* respecting claims unless a model opts out.
|
|
34
|
-
*
|
|
35
|
-
* For a `stale_context` conflict, the decision honors the committer's declared
|
|
36
|
-
* `onStale` intent: `'notify'` holds the write and notifies the actor to
|
|
37
|
-
* resolve it, and anything else (including `'reject'` or an absent value)
|
|
38
|
-
* rejects. An `onStale` of `'overwrite'` never reaches a policy — it is a hard
|
|
39
|
-
* opt-out resolved before the conflict is detected.
|
|
40
|
-
*
|
|
41
|
-
* To change this behavior for a model, declare its conflict axis in the schema;
|
|
42
|
-
* a declared axis overrides this default.
|
|
43
|
-
*/
|
|
44
|
-
// Typed by its real synchronous shape with `satisfies`, rather than the
|
|
45
|
-
// async-permissive `ConflictPolicy` alias, so synchronous callers such as
|
|
46
|
-
// `interpretConflictAxis` and `capabilityPreemptPolicy` receive a plain
|
|
47
|
-
// `ConflictDecision` rather than `ConflictDecision | Promise<…>`. It remains
|
|
48
|
-
// assignable to `ConflictPolicy` wherever it is used as one.
|
|
49
|
-
export const defaultPolicy = ((conflict) => {
|
|
50
|
-
if (conflict.kind === 'claim_held') {
|
|
51
|
-
// A human (`user`) is never blocked; agents and system actors yield.
|
|
52
|
-
// Keeping every non-`user` kind on `reject` here ensures an agent cannot
|
|
53
|
-
// bypass a claim even on this default resolution path, which — unlike the
|
|
54
|
-
// declared-axis path — has no separate agent guard of its own.
|
|
55
|
-
return conflict.committer.kind === 'user'
|
|
56
|
-
? { action: 'allow', note: 'principal:not-blocked' }
|
|
57
|
-
: { action: 'reject', reason: 'claim_conflict' };
|
|
58
|
-
}
|
|
59
|
-
return conflict.requestedMode === 'notify'
|
|
60
|
-
? { action: 'notify', reason: 'stale_notify_hold' }
|
|
61
|
-
: { action: 'reject', reason: 'stale_context' };
|
|
62
|
-
});
|
|
63
|
-
/**
|
|
64
|
-
* A ready-made policy that grants capability-gated preemption. When the
|
|
65
|
-
* committer's capability allowlist includes the `claim.preempt` operation, a
|
|
66
|
-
* `claim_held` conflict is preempted: the current holder is evicted and the
|
|
67
|
-
* committer takes the lease. Every other conflict falls back to
|
|
68
|
-
* {@link defaultPolicy}, which rejects. Register it as your conflict policy to
|
|
69
|
-
* let a privileged identity take over a held entity without writing a bespoke
|
|
70
|
-
* policy. The authorization rests on holding the capability, not on any
|
|
71
|
-
* particular identity string.
|
|
72
|
-
*/
|
|
73
|
-
export const capabilityPreemptPolicy = (conflict) => {
|
|
74
|
-
if (conflict.kind === 'claim_held' &&
|
|
75
|
-
conflict.committerOperations.includes('claim.preempt')) {
|
|
76
|
-
return { action: 'preempt', reason: 'capability:claim.preempt' };
|
|
77
|
-
}
|
|
78
|
-
return defaultPolicy(conflict);
|
|
79
|
-
};
|
|
80
|
-
const _conflictAxisPinned = [true, true];
|
|
81
|
-
void _conflictAxisPinned;
|
|
82
|
-
/**
|
|
83
|
-
* Resolves a declared {@link ConflictAxis} into a {@link ConflictDecision} for
|
|
84
|
-
* one concrete conflict. It is pure and synchronous, doing no I/O, so it can
|
|
85
|
-
* run on either the client or the server. It reads the committer's kind from
|
|
86
|
-
* the conflict and maps the declared mode:
|
|
87
|
-
*
|
|
88
|
-
* - undefined → the engine default, {@link defaultPolicy}: a human is
|
|
89
|
-
* allowed, an agent or system committer is rejected on a
|
|
90
|
-
* `claim_held`, and a stale write honors `onStale: 'notify'`.
|
|
91
|
-
* - `overwrite` → `allow`; the write wins and the committer is never blocked.
|
|
92
|
-
* - `reject` → `reject`; the committer yields.
|
|
93
|
-
* - `notify` → on a `stale_context` conflict, hold the write and notify so
|
|
94
|
-
* the committer re-reads and re-applies; on a `claim_held`
|
|
95
|
-
* conflict there is no held write to reconcile (see
|
|
96
|
-
* {@link ConflictDecision} `notify`), so it degrades to
|
|
97
|
-
* `reject` rather than silently writing to a claimed row.
|
|
98
|
-
*
|
|
99
|
-
* This is only the generic interpretation. Stronger server-side rules — such as
|
|
100
|
-
* an agent never bypassing a claim held by someone else — are enforced where
|
|
101
|
-
* the decision is applied, not here.
|
|
102
|
-
*/
|
|
103
|
-
export function interpretConflictAxis(axis, conflict) {
|
|
104
|
-
const mode = axis[conflict.committer.kind];
|
|
105
|
-
if (mode === undefined)
|
|
106
|
-
return defaultPolicy(conflict);
|
|
107
|
-
switch (mode) {
|
|
108
|
-
case 'overwrite':
|
|
109
|
-
return { action: 'allow', note: 'conflict:overwrite' };
|
|
110
|
-
case 'reject':
|
|
111
|
-
return {
|
|
112
|
-
action: 'reject',
|
|
113
|
-
reason: conflict.kind === 'claim_held' ? 'claim_conflict' : 'stale_context',
|
|
114
|
-
};
|
|
115
|
-
case 'notify':
|
|
116
|
-
return conflict.kind === 'stale_context'
|
|
117
|
-
? { action: 'notify', reason: 'stale_notify_hold' }
|
|
118
|
-
: { action: 'reject', reason: 'claim_conflict' };
|
|
119
|
-
default: {
|
|
120
|
-
// Exhaustiveness backstop: a future `OnStaleMode` member surfaces as a
|
|
121
|
-
// localized compile error here, not a missing-return at the signature.
|
|
122
|
-
const _exhaustive = mode;
|
|
123
|
-
return _exhaustive;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The functional update — `ablo.<model>.update(id, current => next)`.
|
|
3
|
-
*
|
|
4
|
-
* This is the surface that just works under contention. You express only your
|
|
5
|
-
* intent — given the latest row, here is the next state — and the client does
|
|
6
|
-
* the rest: it reads the fresh row and its watermark, runs your updater, writes
|
|
7
|
-
* the result as a compare-and-swap against that watermark, and on any concurrent
|
|
8
|
-
* write it re-reads, recomputes, and retries. No claim, no identity, no transport
|
|
9
|
-
* awareness, and no `stale_context` or `claim_*` error codes ever reach the
|
|
10
|
-
* caller. The write either lands or, at the extreme, throws a single
|
|
11
|
-
* {@link AbloContentionError} once the reconcile budget is spent.
|
|
12
|
-
*
|
|
13
|
-
* Correctness comes from the `readAt` watermark plus `onStale: 'reject'`
|
|
14
|
-
* (optimistic concurrency, or compare-and-swap), not from participant identity.
|
|
15
|
-
* That is why it is immune to the shared-credential silent-overwrite hazard and
|
|
16
|
-
* behaves identically on both transports: the HTTP and WebSocket clients inject
|
|
17
|
-
* the same two functions ({@link ReconcileTransport}) into the shared loop below,
|
|
18
|
-
* so the guarantee cannot drift between them — only the mechanism differs.
|
|
19
|
-
*
|
|
20
|
-
* The mental model is React's `setState(prev => next)`: pass a function of the
|
|
21
|
-
* current state and the runtime owns reconciliation.
|
|
22
|
-
*/
|
|
23
|
-
import { AbloContentionError } from '../errors.js';
|
|
24
|
-
/**
|
|
25
|
-
* The functional form of an update: given the freshly-read row, return the
|
|
26
|
-
* fields to write. Return `null` or `undefined` to make no write — a no-op the
|
|
27
|
-
* caller chose after seeing the latest state (for example, "already done").
|
|
28
|
-
*/
|
|
29
|
-
export type ModelUpdater<T> = (current: T) => Partial<T> | null | undefined | Promise<Partial<T> | null | undefined>;
|
|
30
|
-
/** Tuning for the functional update's internal reconcile loop. */
|
|
31
|
-
export interface ContentionOptions {
|
|
32
|
-
/**
|
|
33
|
-
* Max reconcile rounds under contention before throwing
|
|
34
|
-
* {@link AbloContentionError}. Each round re-reads the latest row and re-runs
|
|
35
|
-
* your updater. Defaults to {@link DEFAULT_CONTENTION_RETRIES}.
|
|
36
|
-
*/
|
|
37
|
-
readonly retries?: number;
|
|
38
|
-
/** Abort the reconcile loop (e.g. the request was cancelled). */
|
|
39
|
-
readonly signal?: AbortSignal;
|
|
40
|
-
}
|
|
41
|
-
/** Reconcile rounds before a hot row is declared permanently contended. */
|
|
42
|
-
export declare const DEFAULT_CONTENTION_RETRIES = 16;
|
|
43
|
-
/**
|
|
44
|
-
* Reports whether a thrown error means "another writer moved the row — re-read
|
|
45
|
-
* and retry" rather than a genuine failure to surface. These are the
|
|
46
|
-
* optimistic-concurrency signals the functional update reconciles against:
|
|
47
|
-
* - `stale_context` — the `readAt` watermark was overtaken by a concurrent write
|
|
48
|
-
* - `claim_lost` — a holder preempted the write (for example a human under `humansOverwrite`)
|
|
49
|
-
* - `claim_queued` — a holder is actively editing the row right now
|
|
50
|
-
*/
|
|
51
|
-
export declare function isReconcilableConflict(err: unknown): boolean;
|
|
52
|
-
/**
|
|
53
|
-
* The transport-specific read and write that the shared loop drives. Each client
|
|
54
|
-
* injects its own pair — the one thing that differs between the HTTP and
|
|
55
|
-
* WebSocket transports.
|
|
56
|
-
*/
|
|
57
|
-
export interface ReconcileTransport<T, R> {
|
|
58
|
-
readonly model: string;
|
|
59
|
-
readonly id: string;
|
|
60
|
-
/** Read the latest row and its watermark from the authoritative store. */
|
|
61
|
-
readFresh: () => Promise<{
|
|
62
|
-
readonly data: T | null | undefined;
|
|
63
|
-
readonly stamp: number;
|
|
64
|
-
}>;
|
|
65
|
-
/**
|
|
66
|
-
* Write the computed patch as a compare-and-swap against `readAt`. It must
|
|
67
|
-
* throw a reconcilable conflict (`stale_context` or `claim_*`) when the
|
|
68
|
-
* watermark was overtaken — that rejection is what drives the next reconcile
|
|
69
|
-
* round.
|
|
70
|
-
*/
|
|
71
|
-
writeNext: (patch: Partial<T>, readAt: number) => Promise<R>;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Run the read-fresh → compute → compare-and-swap → reconcile loop. Shared by
|
|
75
|
-
* both transports so the guarantee is provably identical. Returns the write's
|
|
76
|
-
* result, or `undefined` when the updater opted out of writing.
|
|
77
|
-
*/
|
|
78
|
-
export declare function reconcileFunctionalUpdate<T, R>(updater: ModelUpdater<T>, options: ContentionOptions | undefined, transport: ReconcileTransport<T, R>): Promise<R | undefined>;
|
|
79
|
-
export { AbloContentionError };
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The functional update — `ablo.<model>.update(id, current => next)`.
|
|
3
|
-
*
|
|
4
|
-
* This is the surface that just works under contention. You express only your
|
|
5
|
-
* intent — given the latest row, here is the next state — and the client does
|
|
6
|
-
* the rest: it reads the fresh row and its watermark, runs your updater, writes
|
|
7
|
-
* the result as a compare-and-swap against that watermark, and on any concurrent
|
|
8
|
-
* write it re-reads, recomputes, and retries. No claim, no identity, no transport
|
|
9
|
-
* awareness, and no `stale_context` or `claim_*` error codes ever reach the
|
|
10
|
-
* caller. The write either lands or, at the extreme, throws a single
|
|
11
|
-
* {@link AbloContentionError} once the reconcile budget is spent.
|
|
12
|
-
*
|
|
13
|
-
* Correctness comes from the `readAt` watermark plus `onStale: 'reject'`
|
|
14
|
-
* (optimistic concurrency, or compare-and-swap), not from participant identity.
|
|
15
|
-
* That is why it is immune to the shared-credential silent-overwrite hazard and
|
|
16
|
-
* behaves identically on both transports: the HTTP and WebSocket clients inject
|
|
17
|
-
* the same two functions ({@link ReconcileTransport}) into the shared loop below,
|
|
18
|
-
* so the guarantee cannot drift between them — only the mechanism differs.
|
|
19
|
-
*
|
|
20
|
-
* The mental model is React's `setState(prev => next)`: pass a function of the
|
|
21
|
-
* current state and the runtime owns reconciliation.
|
|
22
|
-
*/
|
|
23
|
-
import { AbloError, AbloNotFoundError, AbloStaleContextError, AbloClaimedError, AbloContentionError, } from '../errors.js';
|
|
24
|
-
/** Reconcile rounds before a hot row is declared permanently contended. */
|
|
25
|
-
export const DEFAULT_CONTENTION_RETRIES = 16;
|
|
26
|
-
/**
|
|
27
|
-
* Reports whether a thrown error means "another writer moved the row — re-read
|
|
28
|
-
* and retry" rather than a genuine failure to surface. These are the
|
|
29
|
-
* optimistic-concurrency signals the functional update reconciles against:
|
|
30
|
-
* - `stale_context` — the `readAt` watermark was overtaken by a concurrent write
|
|
31
|
-
* - `claim_lost` — a holder preempted the write (for example a human under `humansOverwrite`)
|
|
32
|
-
* - `claim_queued` — a holder is actively editing the row right now
|
|
33
|
-
*/
|
|
34
|
-
export function isReconcilableConflict(err) {
|
|
35
|
-
if (err instanceof AbloStaleContextError)
|
|
36
|
-
return true;
|
|
37
|
-
if (err instanceof AbloClaimedError) {
|
|
38
|
-
return err.code === 'claim_lost' || err.code === 'claim_queued';
|
|
39
|
-
}
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
43
|
-
/**
|
|
44
|
-
* Jittered backoff so N reconcilers retrying at once don't lock-step straight
|
|
45
|
-
* back into the same collision. Bounded; grows mildly with the attempt.
|
|
46
|
-
*/
|
|
47
|
-
function backoffMs(attempt) {
|
|
48
|
-
return 60 + attempt * 40 + Math.floor(Math.random() * 60);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Run the read-fresh → compute → compare-and-swap → reconcile loop. Shared by
|
|
52
|
-
* both transports so the guarantee is provably identical. Returns the write's
|
|
53
|
-
* result, or `undefined` when the updater opted out of writing.
|
|
54
|
-
*/
|
|
55
|
-
export async function reconcileFunctionalUpdate(updater, options, transport) {
|
|
56
|
-
const retries = options?.retries ?? DEFAULT_CONTENTION_RETRIES;
|
|
57
|
-
let lastConflict;
|
|
58
|
-
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
59
|
-
if (options?.signal?.aborted) {
|
|
60
|
-
throw new AbloError(`Update of ${transport.model}/${transport.id} was aborted before it landed.`, { code: 'update_aborted' });
|
|
61
|
-
}
|
|
62
|
-
const { data, stamp } = await transport.readFresh();
|
|
63
|
-
if (data == null) {
|
|
64
|
-
throw new AbloNotFoundError(`Cannot update ${transport.model}/${transport.id}: it does not exist (or is ` +
|
|
65
|
-
`outside this credential's scope).`, [transport.id]);
|
|
66
|
-
}
|
|
67
|
-
const patch = await updater(data);
|
|
68
|
-
if (patch == null)
|
|
69
|
-
return undefined; // updater opted out after reading fresh
|
|
70
|
-
try {
|
|
71
|
-
return await transport.writeNext(patch, stamp);
|
|
72
|
-
}
|
|
73
|
-
catch (err) {
|
|
74
|
-
if (!isReconcilableConflict(err))
|
|
75
|
-
throw err; // genuine failure — surface it
|
|
76
|
-
lastConflict = err;
|
|
77
|
-
if (attempt < retries)
|
|
78
|
-
await sleep(backoffMs(attempt));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
throw new AbloContentionError(transport.model, transport.id, retries + 1, {
|
|
82
|
-
cause: lastConflict,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
// Re-exported so call sites import the loop and its terminal error from one
|
|
86
|
-
// place; the class itself lives with the rest of the error hierarchy.
|
|
87
|
-
export { AbloContentionError };
|
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared resource types for the typed clients and private HTTP transport.
|
|
3
|
-
* the commit and claim shapes, the session-mint params and resource, and the
|
|
4
|
-
* {@link HttpClaimApi} derivation. This module holds only types and has no runtime
|
|
5
|
-
* imports.
|
|
6
|
-
*/
|
|
7
|
-
import type { ClaimHeartbeatAckPayload, OnStaleMode, ReadDependency, TrackDependency } from '../coordination/schema.js';
|
|
8
|
-
import type { ClaimHeartbeatReply, ClaimState } from '../wire/claims.js';
|
|
9
|
-
import type { ClientCommitReceipt, CommitWait } from '../wire/commit.js';
|
|
10
|
-
export type { CommitWait };
|
|
11
|
-
import type { ModelTarget, ModelClaim } from '../coordination/schema.js';
|
|
12
|
-
export type { ModelTarget, ModelClaim };
|
|
13
|
-
import type { ResolveClaimMeta } from '../types/global.js';
|
|
14
|
-
import type { SchemaRecord } from '../schema/schema.js';
|
|
15
|
-
import type { SyncGroupInput } from '../schema/roles.js';
|
|
16
|
-
import type { CapabilityCan, CapabilityOperation, CapabilityScope } from '../auth/capability.js';
|
|
17
|
-
import type { Claim, ClaimStream, ClaimWaitOptions, Duration, HeldClaim } from '../types/streams.js';
|
|
18
|
-
import type { ClaimOptions, ClaimParams, ClaimReadApi, AwaitedClaimMethod } from './modelOperations.js';
|
|
19
|
-
/**
|
|
20
|
-
* The operations available on each model in the sync engine:
|
|
21
|
-
* `retrieve({ id })` — an async single-row server read
|
|
22
|
-
* `list({ where })` — an async collection server read
|
|
23
|
-
* `local.retrieve(id)` / `local.list(...)` / `local.count(...)` — synchronous local reads
|
|
24
|
-
* `create({ data })` / `update({ id, data })` / `delete({ id })` — writes
|
|
25
|
-
* `claim({ id })` — a durable claim handle for coordinated writes
|
|
26
|
-
*/
|
|
27
|
-
export type ModelOperationAction = 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
|
|
28
|
-
export type IfClaimedPolicy = 'return' | 'fail';
|
|
29
|
-
export interface ClaimedOptions {
|
|
30
|
-
/**
|
|
31
|
-
* What to do when another participant has claimed the target: `return` lets
|
|
32
|
-
* the read proceed; `fail` throws `AbloClaimedError`. Inspect claim state via
|
|
33
|
-
* `ablo.<model>.claim.state({ id })`. Waiting is a claim-side concern — take
|
|
34
|
-
* `ablo.<model>.claim({ id })` (it queues fairly); reads never block.
|
|
35
|
-
*/
|
|
36
|
-
readonly ifClaimed?: IfClaimedPolicy;
|
|
37
|
-
}
|
|
38
|
-
export type { ClaimWaitOptions } from '../types/streams.js';
|
|
39
|
-
export interface ModelReadOptions extends ClaimedOptions {
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* The target a caller names when creating a claim: {@link ModelTarget} with its
|
|
43
|
-
* one caller-authored member typed — `meta` is the shape declared on
|
|
44
|
-
* `Register`'s `ClaimMeta` slot, the same declaration every reader of the claim
|
|
45
|
-
* is given back.
|
|
46
|
-
*
|
|
47
|
-
* Derived rather than restated, and narrowed only here: `modelTargetSchema`
|
|
48
|
-
* keeps parsing `meta` as an open record, because a peer on a newer build must
|
|
49
|
-
* still be understood. The wire stays permissive; the DTO the caller writes
|
|
50
|
-
* does not.
|
|
51
|
-
*/
|
|
52
|
-
export type ModelTargetInput = Omit<ModelTarget, 'meta'> & {
|
|
53
|
-
readonly meta?: ResolveClaimMeta;
|
|
54
|
-
};
|
|
55
|
-
export interface ClaimCreateOptions {
|
|
56
|
-
readonly target: ModelTargetInput;
|
|
57
|
-
/** Peer-visible description of the work — the same field on every claim
|
|
58
|
-
* surface. Defaults to `'editing'` when omitted. */
|
|
59
|
-
readonly description?: string;
|
|
60
|
-
readonly ttl?: Duration;
|
|
61
|
-
/**
|
|
62
|
-
* Join the server's fair FIFO queue when the target is already claimed,
|
|
63
|
-
* rather than failing immediately. `create` then resolves only once the
|
|
64
|
-
* lease is actually ours (the server pushes `claim_acquired` if the target
|
|
65
|
-
* was free, or `claim_granted` when we reach the head of the line). Without
|
|
66
|
-
* this, a contended claim throws. Used by `ablo.<model>.claim` so writers
|
|
67
|
-
* serialize instead of racing.
|
|
68
|
-
*/
|
|
69
|
-
readonly queue?: boolean;
|
|
70
|
-
/** Cap on how long to wait for a queued grant before rejecting. */
|
|
71
|
-
readonly waitTimeoutMs?: number;
|
|
72
|
-
/** Abort a pending wait from outside — rejects with `claim_wait_aborted`.
|
|
73
|
-
* Ignored once the grant has arrived. */
|
|
74
|
-
readonly signal?: AbortSignal;
|
|
75
|
-
/**
|
|
76
|
-
* Backpressure: reject with `AbloClaimedError('queue_too_deep')` instead of
|
|
77
|
-
* waiting if the queue is already `>= maxQueueDepth` when we join.
|
|
78
|
-
*/
|
|
79
|
-
readonly maxQueueDepth?: number;
|
|
80
|
-
}
|
|
81
|
-
export interface CommitOperationInput {
|
|
82
|
-
readonly action: ModelOperationAction;
|
|
83
|
-
/** The model name — matches `ablo.<model>` and the schema's `model()`. */
|
|
84
|
-
readonly model: string;
|
|
85
|
-
readonly id?: string | null;
|
|
86
|
-
readonly data?: Record<string, unknown> | null;
|
|
87
|
-
readonly transactionId?: string | null;
|
|
88
|
-
readonly readAt?: number | null;
|
|
89
|
-
readonly onStale?: OnStaleMode | null;
|
|
90
|
-
/** Fencing token (Option B) from the batch's claim handle; server-validated. */
|
|
91
|
-
readonly fenceToken?: number | null;
|
|
92
|
-
}
|
|
93
|
-
export interface CommitCreateOptions {
|
|
94
|
-
readonly idempotencyKey?: string | null;
|
|
95
|
-
readonly readAt?: number | null;
|
|
96
|
-
readonly onStale?: OnStaleMode | null;
|
|
97
|
-
/**
|
|
98
|
-
* A claim handle from `ablo.<model>.claim({ id })` (or the HTTP claim
|
|
99
|
-
* surface). Same vocabulary as the per-model writes: the handle's
|
|
100
|
-
* snapshot watermark becomes the batch `readAt` default and `onStale`
|
|
101
|
-
* defaults to `'reject'`, so a commit that follows a claim is guarded
|
|
102
|
-
* against concurrent edits without re-stating the watermark by hand.
|
|
103
|
-
* Explicit `readAt`/`onStale` on the options win.
|
|
104
|
-
*/
|
|
105
|
-
readonly claim?: Claim | null;
|
|
106
|
-
/** One atomic batch. Use a one-element array for a single operation. */
|
|
107
|
-
readonly operations: readonly CommitOperationInput[];
|
|
108
|
-
readonly wait?: CommitWait;
|
|
109
|
-
/**
|
|
110
|
-
* The batch premise — the "did anything I looked at change?" guard.
|
|
111
|
-
* Declare the rows (`{ model, id, readAt, fields? }`) or sync groups
|
|
112
|
-
* (`{ group, readAt }`, for example `report:abc`) this batch was premised on; the
|
|
113
|
-
* server checks that none moved since `readAt` and fires the entry's `onStale`
|
|
114
|
-
* over the batch. This is distinct from the write-target `readAt`: it guards what
|
|
115
|
-
* you read, not what you write.
|
|
116
|
-
*/
|
|
117
|
-
readonly reads?: readonly ReadDependency[] | null;
|
|
118
|
-
/**
|
|
119
|
-
* Durable premises to register as part of this batch — the persisted
|
|
120
|
-
* sibling of `reads`. Where `reads` guards only this commit, a `track` entry
|
|
121
|
-
* (`{ model, id, readAt? }` for a row or `{ group, readAt? }` for a sync group)
|
|
122
|
-
* lives on past it: a later matching change rides back on a future receipt's
|
|
123
|
-
* `notifications`. A track-only batch (just `track`, an empty `operations`) is
|
|
124
|
-
* the batch form of `ablo.<model>.track()`.
|
|
125
|
-
*/
|
|
126
|
-
readonly track?: readonly TrackDependency[] | null;
|
|
127
|
-
}
|
|
128
|
-
/** Public projection inferred from the canonical runtime schema. */
|
|
129
|
-
export type CommitReceipt = ClientCommitReceipt;
|
|
130
|
-
export interface CommitResource {
|
|
131
|
-
create(options: CommitCreateOptions): Promise<CommitReceipt>;
|
|
132
|
-
}
|
|
133
|
-
export interface ClaimResource extends ClaimStream {
|
|
134
|
-
create(options: ClaimCreateOptions): Promise<Claim>;
|
|
135
|
-
list(target?: Partial<ModelTarget>): readonly ModelClaim[];
|
|
136
|
-
waitFor(target: Partial<ModelTarget>, options?: ClaimWaitOptions): Promise<void>;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* The claim-ticket surface of the stateless HTTP client — the operations a
|
|
140
|
-
* caller performs holding only a `claimId`, which is what a queued acquire
|
|
141
|
-
* leaves in its hand (`AbloClaimedError('claim_queued')` carries it on
|
|
142
|
-
* `error.claims`). The WebSocket client never needs these: it awaits the grant
|
|
143
|
-
* on its socket.
|
|
144
|
-
*
|
|
145
|
-
* All three shapes are the wire's own — `claimStateSchema`,
|
|
146
|
-
* `claimHeartbeatReplySchema`, and the batch ack — so this surface cannot
|
|
147
|
-
* describe a response the server does not send.
|
|
148
|
-
*/
|
|
149
|
-
export interface HttpClaimsResource {
|
|
150
|
-
/**
|
|
151
|
-
* The claim's current state, by its id — `GET /v1/claims/{claimId}`. The
|
|
152
|
-
* poll half of the queued-grant handover: a queued caller polls until
|
|
153
|
-
* `status` is `'active'`, at which point `fenceToken` is present and the
|
|
154
|
-
* work can begin. `position` is advisory (a privileged caller can reorder
|
|
155
|
-
* the line, so it may go up); only `status` is authoritative.
|
|
156
|
-
*/
|
|
157
|
-
retrieve(params: {
|
|
158
|
-
readonly claimId: string;
|
|
159
|
-
}): Promise<ClaimState>;
|
|
160
|
-
/**
|
|
161
|
-
* One beat on the named lease — `POST /v1/claims/{claimId}/heartbeat`. On a
|
|
162
|
-
* held lease it extends the TTL; on a queued ticket it refreshes the
|
|
163
|
-
* waiter's slot in the line and reports `{ status: 'queued', position }`.
|
|
164
|
-
*/
|
|
165
|
-
heartbeat(params: {
|
|
166
|
-
readonly claimId: string;
|
|
167
|
-
readonly ttl?: string | number;
|
|
168
|
-
}): Promise<ClaimHeartbeatReply>;
|
|
169
|
-
/**
|
|
170
|
-
* One beat for every lease this identity holds — `POST /v1/claims/heartbeat`,
|
|
171
|
-
* one ack per extended lease. The socketless twin of the realtime
|
|
172
|
-
* keepalive, for a stateless worker holding many rows.
|
|
173
|
-
*/
|
|
174
|
-
heartbeatAll(options?: {
|
|
175
|
-
readonly ttl?: string | number;
|
|
176
|
-
}): Promise<readonly ClaimHeartbeatAckPayload[]>;
|
|
177
|
-
/**
|
|
178
|
-
* Give the ticket back — `DELETE /v1/claims/{claimId}`. On a held lease this
|
|
179
|
-
* releases it and promotes the head of the queue; on a queued ticket it
|
|
180
|
-
* leaves the line, so the waiters behind move up instead of waiting out
|
|
181
|
-
* your slot's TTL. Idempotent: releasing an already-ended claim is a no-op.
|
|
182
|
-
*/
|
|
183
|
-
release(params: {
|
|
184
|
-
readonly claimId: string;
|
|
185
|
-
}): Promise<void>;
|
|
186
|
-
}
|
|
187
|
-
export interface ModelMutationOptions extends ClaimedOptions {
|
|
188
|
-
readonly claimRef?: string | {
|
|
189
|
-
readonly id: string;
|
|
190
|
-
} | null;
|
|
191
|
-
readonly idempotencyKey?: string | null;
|
|
192
|
-
readonly readAt?: number | null;
|
|
193
|
-
readonly onStale?: OnStaleMode | null;
|
|
194
|
-
readonly wait?: CommitWait;
|
|
195
|
-
readonly claim?: Claim | ClaimOptions | null;
|
|
196
|
-
/** Fencing token (Option B) from the claim; server-validated at commit. */
|
|
197
|
-
readonly fenceToken?: number | null;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* The stateless HTTP claim surface. Most code puts a `claim` directly on the write
|
|
201
|
-
* (`update({ id, data, claim })`) and lets the SDK release it; reach for this
|
|
202
|
-
* namespace for multi-step handles and coordination screens.
|
|
203
|
-
*
|
|
204
|
-
* It is the same surface as the reactive claim API, but because every read is a
|
|
205
|
-
* server round-trip, `state`, `queue`, and `reorder` are awaited here. The
|
|
206
|
-
* WebSocket client resolves those synchronously from its local cache, which is what
|
|
207
|
-
* lets it read a claim's state inside a React render; a stateless client has no
|
|
208
|
-
* cache to read, so the promise is unavoidable.
|
|
209
|
-
*
|
|
210
|
-
* It is derived from `ClaimReadApi` through {@link AwaitedClaimMethod} so the two
|
|
211
|
-
* transports cannot drift: the only difference is the promise wrapper that
|
|
212
|
-
* statelessness forces. `claim({ id })` is identical on both (already async);
|
|
213
|
-
* `state`, `queue`, `reorder`, and `release` are the awaited form.
|
|
214
|
-
*/
|
|
215
|
-
export type HttpClaimApi<T = Record<string, unknown>> = ((params: ClaimParams<T> & {
|
|
216
|
-
queue: false;
|
|
217
|
-
}) => Promise<HeldClaim<T> | null>) & ((params: ClaimParams<T>) => Promise<HeldClaim<T>>) & {
|
|
218
|
-
[K in keyof ClaimReadApi<T>]: AwaitedClaimMethod<ClaimReadApi<T>[K]>;
|
|
219
|
-
};
|
|
220
|
-
/** A single data operation a scoped **agent** session may perform on a model.
|
|
221
|
-
* The SDK-facing name for {@link CapabilityOperation}; the vocabulary itself is
|
|
222
|
-
* declared once, as a schema, in `auth/capability.ts`. */
|
|
223
|
-
export type SessionOperation = CapabilityOperation;
|
|
224
|
-
/** Parameters for minting an end-user session — full data authority within the
|
|
225
|
-
* organization. Mints an `ek_` token. `user.id` is your end user's id from your
|
|
226
|
-
* own identity provider and becomes the session's `participantId`; Ablo does not
|
|
227
|
-
* model your users, so it is treated as an opaque string at the trust boundary. */
|
|
228
|
-
export interface CreateUserSessionParams {
|
|
229
|
-
/** Your end user. `id` becomes the token's `participantId`. */
|
|
230
|
-
user: {
|
|
231
|
-
id: string;
|
|
232
|
-
};
|
|
233
|
-
/** Mint the session into this organization instead of the key's own — for a
|
|
234
|
-
* platform that serves many tenants from one backend. Requires the `sk_` key to
|
|
235
|
-
* carry the `ephemeral:mint-any-org` scope; omit it for the normal
|
|
236
|
-
* single-tenant case. */
|
|
237
|
-
organizationId?: string;
|
|
238
|
-
/** Sync groups this session may subscribe to — typed (`'default'` or
|
|
239
|
-
* `<namespace>:<id>`; build with `syncGroup(kind, id)` from
|
|
240
|
-
* `@abloatai/ablo/schema`). Omit for the server default:
|
|
241
|
-
* `[org:<your org>, user:<user.id>]`. */
|
|
242
|
-
syncGroups?: readonly SyncGroupInput[];
|
|
243
|
-
/** Token lifetime in seconds. Defaults to 900 (15 minutes). */
|
|
244
|
-
ttlSeconds?: number;
|
|
245
|
-
/** Opaque identity blob echoed back to the client as `ablo.user`. */
|
|
246
|
-
userMeta?: Record<string, unknown>;
|
|
247
|
-
agent?: never;
|
|
248
|
-
can?: never;
|
|
249
|
-
}
|
|
250
|
-
/** Mint params for a scoped **agent** session — mints a restricted `rk_` token
|
|
251
|
-
* gated to exactly the operations named in `can`. `can` is typed off your
|
|
252
|
-
* schema (no magic `'task.update'` strings): `{ Task: ['update'], Report: ['read'] }`
|
|
253
|
-
* — the SDK serializes each entry to the wire allowlist (`task.update`). */
|
|
254
|
-
export interface CreateAgentSessionParams<S extends SchemaRecord> {
|
|
255
|
-
/** Your agent. `id` becomes the token's `participantId`. */
|
|
256
|
-
agent: {
|
|
257
|
-
id: string;
|
|
258
|
-
};
|
|
259
|
-
/** Per-model operation allowlist, typed against the schema's model names. */
|
|
260
|
-
can: CapabilityCan<S>;
|
|
261
|
-
/** Sync groups this session may subscribe to — typed (`'default'` or
|
|
262
|
-
* `<namespace>:<id>`; build with `syncGroup(kind, id)` from
|
|
263
|
-
* `@abloatai/ablo/schema`). Omit for the server default: the org
|
|
264
|
-
* anchor (`org:<your org>`) + the agent's own anchor. */
|
|
265
|
-
syncGroups?: readonly SyncGroupInput[];
|
|
266
|
-
/** Token lifetime in seconds. Defaults to 900 (15 minutes). */
|
|
267
|
-
ttlSeconds?: number;
|
|
268
|
-
/** Opaque identity blob echoed back to the client as `ablo.agent`. */
|
|
269
|
-
userMeta?: Record<string, unknown>;
|
|
270
|
-
user?: never;
|
|
271
|
-
}
|
|
272
|
-
/** Params for {@link Ablo.sessions}.create — a discriminated union: pass
|
|
273
|
-
* `{ user }` for a full-authority end-user session (`ek_`) or `{ agent, can }`
|
|
274
|
-
* for a scoped agent session (`rk_`). */
|
|
275
|
-
export type CreateSessionParams<S extends SchemaRecord> = CreateUserSessionParams | CreateAgentSessionParams<S>;
|
|
276
|
-
/** Params for {@link Ablo.agents}.create — a flattened agent descriptor (no
|
|
277
|
-
* `{ agent }` discriminator: `agents.create` only ever mints an agent). Unlike
|
|
278
|
-
* {@link CreateSessionParams} it resolves to a connected, scoped {@link Ablo}
|
|
279
|
-
* client rather than a raw token. */
|
|
280
|
-
export interface CreateAgentClientParams<S extends SchemaRecord> {
|
|
281
|
-
/** The wire participant identity (`agent:<id>`) that claim exclusion and the
|
|
282
|
-
* FIFO queue gate on. Omit it to get a fresh random id — a distinct, independent
|
|
283
|
-
* participant, which is the default and what you want for concurrent agents.
|
|
284
|
-
* Pass a stable string only when one logical agent must re-attach to its own
|
|
285
|
-
* held claims across reconnects or restarts. */
|
|
286
|
-
id?: string;
|
|
287
|
-
/** A human-readable label for logs and attribution (carried in `userMeta.name`).
|
|
288
|
-
* It is independent of `id`: two agents that share a `name` still receive
|
|
289
|
-
* distinct ids and coordinate as separate participants — `name` never derives or
|
|
290
|
-
* collapses identity. */
|
|
291
|
-
name?: string;
|
|
292
|
-
/** Per-model operation allowlist, typed against the schema's model names. */
|
|
293
|
-
can: CapabilityCan<S>;
|
|
294
|
-
/** Sync groups this agent may subscribe to — typed (`'default'` or
|
|
295
|
-
* `<namespace>:<id>`). Omit for the server default (org anchor + the
|
|
296
|
-
* agent's own anchor). */
|
|
297
|
-
syncGroups?: readonly SyncGroupInput[];
|
|
298
|
-
/** Token lifetime in seconds. Defaults to 900 (15 minutes); the returned client
|
|
299
|
-
* re-mints before expiry, so a long-running agent never handles rotation
|
|
300
|
-
* itself. */
|
|
301
|
-
ttlSeconds?: number;
|
|
302
|
-
/** Extra opaque identity blob echoed on the session scope. Merged with
|
|
303
|
-
* `name` (the `name` param wins if you also set `userMeta.name`). */
|
|
304
|
-
userMeta?: Record<string, unknown>;
|
|
305
|
-
}
|
|
306
|
-
/** A minted session. `token` is the secret the holder presents as its bearer. */
|
|
307
|
-
export interface AbloSession {
|
|
308
|
-
object: 'session';
|
|
309
|
-
/** Stable id of the minted credential (for revocation). */
|
|
310
|
-
id: string;
|
|
311
|
-
/** The short-lived session token — `ek_` for a `{ user }` session, `rk_`
|
|
312
|
-
* for an `{ agent }` session. Hand this to the participant's runtime. */
|
|
313
|
-
token: string;
|
|
314
|
-
/** ISO-8601 expiry. */
|
|
315
|
-
expiresAt: string;
|
|
316
|
-
organizationId: string;
|
|
317
|
-
/** The grant this token carries, on both axes — the same shape the key row
|
|
318
|
-
* stores and the gates enforce. */
|
|
319
|
-
scope: CapabilityScope;
|
|
320
|
-
userMeta: Record<string, unknown>;
|
|
321
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared resource types for the typed clients and private HTTP transport.
|
|
3
|
-
* the commit and claim shapes, the session-mint params and resource, and the
|
|
4
|
-
* {@link HttpClaimApi} derivation. This module holds only types and has no runtime
|
|
5
|
-
* imports.
|
|
6
|
-
*/
|
|
7
|
-
export {};
|