@abloatai/ablo 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +71 -1929
- package/NOTICE +2 -2
- package/README.md +23 -532
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -112
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -161
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.js.map +1 -0
- package/dist/source-drizzle.d.ts +2 -0
- package/dist/source-drizzle.d.ts.map +1 -0
- package/dist/source-drizzle.js +2 -0
- package/dist/source-drizzle.js.map +1 -0
- package/dist/source-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +2 -2
- package/docs/api-keys.md +13 -12
- package/docs/api.md +15 -53
- package/docs/audit.md +4 -3
- package/docs/cli.md +11 -11
- package/docs/client-behavior.md +9 -9
- package/docs/concurrency-convention.md +28 -42
- package/docs/coordination.md +228 -86
- package/docs/data-sources.md +5 -5
- package/docs/debugging.md +34 -12
- package/docs/deployment.md +8 -8
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/scoped-agent.md +3 -3
- package/docs/examples/server-agent.md +2 -2
- package/docs/groups.md +57 -3
- package/docs/guarantees.md +37 -10
- package/docs/how-it-works.md +32 -8
- package/docs/idempotency.md +6 -6
- package/docs/identity.md +24 -24
- package/docs/index.md +8 -8
- package/docs/integration-guide.md +38 -16
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +9 -9
- package/docs/migration.md +37 -18
- package/docs/projects.md +1 -1
- package/docs/quickstart.md +2 -2
- package/docs/react.md +24 -13
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/docs/webhooks.md +9 -9
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +12 -12
- package/package.json +64 -174
- package/dist/BaseSyncedStore.d.ts +0 -823
- package/dist/BaseSyncedStore.js +0 -1955
- package/dist/Database.d.ts +0 -335
- package/dist/Database.js +0 -1500
- package/dist/InstanceCache.d.ts +0 -233
- package/dist/InstanceCache.js +0 -1164
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -444
- package/dist/Model.js +0 -909
- package/dist/ModelRegistry.d.ts +0 -221
- package/dist/ModelRegistry.js +0 -537
- package/dist/NetworkMonitor.d.ts +0 -26
- package/dist/NetworkMonitor.js +0 -77
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -551
- package/dist/SyncClient.js +0 -2199
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/cli.cjs +0 -288600
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -149
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -46
- package/dist/client/createInternalComponents.js +0 -92
- package/dist/client/createModelProxy.d.ts +0 -228
- package/dist/client/createModelProxy.js +0 -818
- package/dist/client/humans.d.ts +0 -48
- package/dist/client/humans.js +0 -52
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -48
- package/dist/client/reactiveEngine.js +0 -910
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -29
- package/dist/context.js +0 -58
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/DatabaseManager.d.ts +0 -105
- package/dist/core/DatabaseManager.js +0 -387
- package/dist/core/QueryProcessor.d.ts +0 -75
- package/dist/core/QueryProcessor.js +0 -255
- package/dist/core/QueryView.d.ts +0 -79
- package/dist/core/QueryView.js +0 -218
- package/dist/core/StoreManager.d.ts +0 -112
- package/dist/core/StoreManager.js +0 -302
- package/dist/core/ViewRegistry.d.ts +0 -20
- package/dist/core/ViewRegistry.js +0 -55
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/core/openIDBWithTimeout.d.ts +0 -65
- package/dist/core/openIDBWithTimeout.js +0 -153
- package/dist/core/queryUtils.d.ts +0 -45
- package/dist/core/queryUtils.js +0 -69
- package/dist/core/storeContract.d.ts +0 -145
- package/dist/core/storeContract.js +0 -12
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -227
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/client.d.ts +0 -61
- package/dist/query/client.js +0 -137
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -230
- package/dist/react/AbloProvider.js +0 -455
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/index.d.ts +0 -61
- package/dist/react/index.js +0 -66
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -75
- package/dist/react/useAblo.js +0 -102
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -129
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -41
- package/dist/schema/index.js +0 -76
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -87
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -262
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -81
- package/dist/source/adapter.js +0 -22
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/footprint.d.ts +0 -111
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/SyncActionStore.d.ts +0 -97
- package/dist/stores/SyncActionStore.js +0 -504
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -280
- package/dist/sync/BootstrapFetcher.js +0 -962
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -228
- package/dist/sync/OnDemandLoader.js +0 -742
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -70
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -113
- package/dist/sync/deltaPipeline.js +0 -261
- package/dist/sync/groupChange.d.ts +0 -113
- package/dist/sync/groupChange.js +0 -242
- package/dist/sync/participants.d.ts +0 -115
- package/dist/sync/participants.js +0 -344
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -70
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/httpResponses.d.ts +0 -70
- package/dist/testing/fixtures/httpResponses.js +0 -90
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -186
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -72
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -177
- package/dist/transaction/auth/capability.js +0 -199
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -44
- package/dist/transaction/coordination/locator.d.ts +0 -83
- package/dist/transaction/coordination/locator.js +0 -82
- package/dist/transaction/coordination/schema.d.ts +0 -1473
- package/dist/transaction/coordination/schema.js +0 -1013
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -103
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -480
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -192
- package/dist/transaction/plugin.js +0 -87
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -266
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -319
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -85
- package/dist/transaction/resources/where.js +0 -70
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -126
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -57
- package/dist/transaction/schema/openapi.js +0 -340
- package/dist/transaction/schema/relation.d.ts +0 -199
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -324
- package/dist/transaction/schema/schema.js +0 -305
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -123
- package/dist/transaction/transport/httpClient.js +0 -145
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1276
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -576
- package/dist/transaction/transport/wsTransport.js +0 -1017
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -540
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -25
- package/dist/transaction/utils/duration.js +0 -45
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -351
- package/dist/transaction/wire/accountResponses.js +0 -255
- package/dist/transaction/wire/auth.d.ts +0 -49
- package/dist/transaction/wire/auth.js +0 -57
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -463
- package/dist/transaction/wire/claims.js +0 -229
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -177
- package/dist/transaction/wire/feedEvent.js +0 -39
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -552
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -50
- package/dist/transaction/wire/index.js +0 -74
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
- package/dist/transactions/mutations/MutationQueue.js +0 -2797
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -164
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
- package/dist/transactions/mutations/deltaConfirmation.js +0 -233
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -186
- package/dist/transactions/mutations/replayValidation.js +0 -163
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
- package/docs/interaction-model.md +0 -99
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Capability — the one definition of what a credential may do.
|
|
3
|
-
*
|
|
4
|
-
* A grant is declared once, in the vocabulary a developer writes:
|
|
5
|
-
*
|
|
6
|
-
* can: { documents: ['read', 'update'] }
|
|
7
|
-
*
|
|
8
|
-
* Everything downstream derives from that declaration: the wire spelling
|
|
9
|
-
* (`documents.update`) stored on the key row, the typed `can` a schema narrows
|
|
10
|
-
* to its own models, the request body the mint route parses, the pattern the
|
|
11
|
-
* published contract advertises, and the scope block echoed back on the minted
|
|
12
|
-
* session.
|
|
13
|
-
*
|
|
14
|
-
* Before this module the same grant was spelled five times — a literal union in
|
|
15
|
-
* the resource types, a `z.array(z.string())` on the wire, a hand-rolled
|
|
16
|
-
* field-by-field parser in the mint route, an object literal in the response
|
|
17
|
-
* type, and a hand-written `model.verb` array at each caller that mints without
|
|
18
|
-
* the SDK. Nothing failed when they drifted; the drift surfaced as
|
|
19
|
-
* `capability_scope_denied` on a grant the caller believed it held.
|
|
20
|
-
*
|
|
21
|
-
* Two axes decide blast radius. VERBS come from `can`; ROWS come from
|
|
22
|
-
* `syncGroups`. They belong to one grant, which is why they are declared
|
|
23
|
-
* together here rather than meeting for the first time on the wire.
|
|
24
|
-
*/
|
|
25
|
-
import { z } from 'zod';
|
|
26
|
-
/**
|
|
27
|
-
* The verbs a grant can name — the whole vocabulary, in one place. Every other
|
|
28
|
-
* spelling of an operation in the system derives from this enum: the SDK's
|
|
29
|
-
* `can` values, the wire's `model.verb` pattern, and the JSON Schema the
|
|
30
|
-
* published contract advertises.
|
|
31
|
-
*/
|
|
32
|
-
export declare const capabilityOperationSchema: z.ZodEnum<{
|
|
33
|
-
update: "update";
|
|
34
|
-
create: "create";
|
|
35
|
-
delete: "delete";
|
|
36
|
-
read: "read";
|
|
37
|
-
}>;
|
|
38
|
-
export type CapabilityOperation = z.infer<typeof capabilityOperationSchema>;
|
|
39
|
-
/**
|
|
40
|
-
* One granted operation in its wire spelling: `<model>.<verb>`, lowercased.
|
|
41
|
-
*
|
|
42
|
-
* The template literal derives both halves — the verb set from
|
|
43
|
-
* {@link capabilityOperationSchema}, the pattern in the published contract from
|
|
44
|
-
* the template — so tightening the verb vocabulary can never leave a stale
|
|
45
|
-
* regex or a stale doc behind. The model half is the name the server matches
|
|
46
|
-
* against a model's registered aliases (type name, schema key, or table name),
|
|
47
|
-
* so it stays permissive here and is resolved at the gate.
|
|
48
|
-
*/
|
|
49
|
-
export declare const grantedOperationSchema: z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>;
|
|
50
|
-
export type GrantedOperation = z.infer<typeof grantedOperationSchema>;
|
|
51
|
-
/**
|
|
52
|
-
* The declared grant, per model — the runtime shape of `can`. Model keys are
|
|
53
|
-
* free-form at runtime because the server resolves them against the schema it
|
|
54
|
-
* has; {@link CapabilityCan} narrows them to a known schema's models at the
|
|
55
|
-
* type level.
|
|
56
|
-
*/
|
|
57
|
-
export declare const capabilityCanSchema: z.ZodRecord<z.ZodString, z.ZodReadonly<z.ZodArray<z.ZodEnum<{
|
|
58
|
-
update: "update";
|
|
59
|
-
create: "create";
|
|
60
|
-
delete: "delete";
|
|
61
|
-
read: "read";
|
|
62
|
-
}>>>>;
|
|
63
|
-
/**
|
|
64
|
-
* `can`, narrowed to one schema's model names. A projection of
|
|
65
|
-
* {@link capabilityCanSchema} — the value type is the operation enum, the key
|
|
66
|
-
* domain is the schema's models, so `can: { tasks: ['update'] }` fails to
|
|
67
|
-
* compile against a schema with no `tasks` model.
|
|
68
|
-
*/
|
|
69
|
-
export type CapabilityCan<S> = Partial<Record<keyof S & string, readonly CapabilityOperation[]>>;
|
|
70
|
-
/**
|
|
71
|
-
* Read-your-writes expansion: append `<model>.read` for every model the grant
|
|
72
|
-
* can write.
|
|
73
|
-
*
|
|
74
|
-
* A scoped agent that may update a row must be able to read it, or the read
|
|
75
|
-
* gate (query / bootstrap / entity self-heal / delta fan-out) starves the very
|
|
76
|
-
* writes the grant allows. The write verbs stay the source of truth; reads are
|
|
77
|
-
* derived and deduped, and models the grant cannot write stay unreadable —
|
|
78
|
-
* that is the read-side blast-radius reduction.
|
|
79
|
-
*
|
|
80
|
-
* It lives beside the declaration, so it applies wherever a grant is built,
|
|
81
|
-
* rather than only at whichever mint the callers happen to share. The server
|
|
82
|
-
* applies it again at the mint chokepoint for callers that post raw JSON; the
|
|
83
|
-
* function is idempotent, so the second application is a no-op.
|
|
84
|
-
*/
|
|
85
|
-
export declare function expandReadYourWrites(operations: readonly GrantedOperation[]): GrantedOperation[];
|
|
86
|
-
/**
|
|
87
|
-
* The parts of a model definition a grant can name. Structural, so both the
|
|
88
|
-
* SDK (which holds a `Schema`) and the mint route (which holds the tenant's
|
|
89
|
-
* pushed artifact) derive names from the same rule.
|
|
90
|
-
*/
|
|
91
|
-
export interface CapabilityModelShape {
|
|
92
|
-
readonly typename?: string;
|
|
93
|
-
readonly tableName?: string;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Schema key → the wire name a grant must be minted with.
|
|
97
|
-
*
|
|
98
|
-
* THE derivation. A model whose type name is overridden — schema key
|
|
99
|
-
* `documents`, type name `Document` — has to mint `document.update`, not
|
|
100
|
-
* `documents.update`, and a caller who works that out by hand gets it wrong
|
|
101
|
-
* once and learns at `capability_scope_denied`. Callers pass their schema's
|
|
102
|
-
* models, never a map they assembled themselves.
|
|
103
|
-
*/
|
|
104
|
-
export declare function modelWireNames(models: Readonly<Record<string, CapabilityModelShape>>): Record<string, string>;
|
|
105
|
-
/**
|
|
106
|
-
* Every name the enforcement gates accept for a model, lowercased. Three
|
|
107
|
-
* vocabularies name one logical model — the wire type name (`lineitem`), the
|
|
108
|
-
* schema key (`lineItems`), and the table name (`line_items`) — so a grant
|
|
109
|
-
* minted in any of them is honored, and the mint can tell a real model from a
|
|
110
|
-
* typo without guessing which vocabulary the caller used.
|
|
111
|
-
*/
|
|
112
|
-
export declare function capabilityModelAliases(models: Readonly<Record<string, CapabilityModelShape>>): Set<string>;
|
|
113
|
-
/**
|
|
114
|
-
* The granted operations whose model half names nothing in the schema.
|
|
115
|
-
*
|
|
116
|
-
* A grant is checked against the schema at MINT, the way a write to an unpushed
|
|
117
|
-
* model already fails with `server_execute_unknown_model` — so a typo in
|
|
118
|
-
* `lineitem.update` is a rejected mint rather than a credential that looks
|
|
119
|
-
* healthy and is denied on its first write. Without this the `model` half is a
|
|
120
|
-
* hole: an opaque string nothing validates until enforcement time.
|
|
121
|
-
*/
|
|
122
|
-
export declare function unresolvableOperations(operations: readonly GrantedOperation[], aliases: ReadonlySet<string>): GrantedOperation[];
|
|
123
|
-
/**
|
|
124
|
-
* Serializes a declared `can` into the wire allowlist — the ONE translation
|
|
125
|
-
* from what a developer writes to what the server stores and enforces.
|
|
126
|
-
*
|
|
127
|
-
* `wireNames` comes from {@link modelWireNames} over the client's own schema.
|
|
128
|
-
* It is required rather than optional: an omitted map silently mints the schema
|
|
129
|
-
* key verbatim, which is right for most models and wrong for every model with
|
|
130
|
-
* a type-name override — the kind of default that is correct until it isn't.
|
|
131
|
-
*/
|
|
132
|
-
export declare function grantedOperations(can: Readonly<Record<string, readonly CapabilityOperation[] | undefined>>, wireNames: Readonly<Record<string, string>>): GrantedOperation[];
|
|
133
|
-
/**
|
|
134
|
-
* The grant at rest: what the credential ended up with, on both axes, plus the
|
|
135
|
-
* participant it acts as. The mint echoes this block, the key row stores it,
|
|
136
|
-
* and the gates read it — so a session's reported scope and its enforced scope
|
|
137
|
-
* are the same shape by construction.
|
|
138
|
-
*/
|
|
139
|
-
export declare const capabilityScopeSchema: z.ZodObject<{
|
|
140
|
-
organizationId: z.ZodString;
|
|
141
|
-
syncGroups: z.ZodArray<z.ZodString>;
|
|
142
|
-
operations: z.ZodArray<z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>>;
|
|
143
|
-
participantKind: z.ZodEnum<{
|
|
144
|
-
user: "user";
|
|
145
|
-
agent: "agent";
|
|
146
|
-
system: "system";
|
|
147
|
-
}>;
|
|
148
|
-
participantId: z.ZodString;
|
|
149
|
-
}, z.core.$strip>;
|
|
150
|
-
export type CapabilityScope = z.infer<typeof capabilityScopeSchema>;
|
|
151
|
-
/**
|
|
152
|
-
* `POST /v1/capabilities` — mint a capability for a participant.
|
|
153
|
-
*
|
|
154
|
-
* Where an ephemeral key is a session for a person, a capability is a scoped,
|
|
155
|
-
* revocable grant for an agent or a system. Narrow by default: an agent or
|
|
156
|
-
* system capability must name its `operations` unless the caller explicitly
|
|
157
|
-
* asks for `wideScope`, which is itself privileged.
|
|
158
|
-
*
|
|
159
|
-
* This is the parsed body — the mint route validates against it rather than
|
|
160
|
-
* reading fields one at a time, so the shape and the validation rules cannot
|
|
161
|
-
* drift from each other or from the published contract.
|
|
162
|
-
*/
|
|
163
|
-
export declare const capabilityRequestSchema: z.ZodObject<{
|
|
164
|
-
participantKind: z.ZodEnum<{
|
|
165
|
-
user: "user";
|
|
166
|
-
agent: "agent";
|
|
167
|
-
system: "system";
|
|
168
|
-
}>;
|
|
169
|
-
participantId: z.ZodOptional<z.ZodString>;
|
|
170
|
-
syncGroups: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodUnion<readonly [z.ZodLiteral<"default">, z.core.$ZodBranded<z.ZodTemplateLiteral<`${string}:${string}`>, "SyncGroup", "out">]>>>>;
|
|
171
|
-
operations: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>>>>;
|
|
172
|
-
ttlSeconds: z.ZodNumber;
|
|
173
|
-
label: z.ZodOptional<z.ZodString>;
|
|
174
|
-
wideScope: z.ZodOptional<z.ZodBoolean>;
|
|
175
|
-
userMeta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
176
|
-
}, z.core.$strip>;
|
|
177
|
-
export type CapabilityRequest = z.infer<typeof capabilityRequestSchema>;
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Capability — the one definition of what a credential may do.
|
|
3
|
-
*
|
|
4
|
-
* A grant is declared once, in the vocabulary a developer writes:
|
|
5
|
-
*
|
|
6
|
-
* can: { documents: ['read', 'update'] }
|
|
7
|
-
*
|
|
8
|
-
* Everything downstream derives from that declaration: the wire spelling
|
|
9
|
-
* (`documents.update`) stored on the key row, the typed `can` a schema narrows
|
|
10
|
-
* to its own models, the request body the mint route parses, the pattern the
|
|
11
|
-
* published contract advertises, and the scope block echoed back on the minted
|
|
12
|
-
* session.
|
|
13
|
-
*
|
|
14
|
-
* Before this module the same grant was spelled five times — a literal union in
|
|
15
|
-
* the resource types, a `z.array(z.string())` on the wire, a hand-rolled
|
|
16
|
-
* field-by-field parser in the mint route, an object literal in the response
|
|
17
|
-
* type, and a hand-written `model.verb` array at each caller that mints without
|
|
18
|
-
* the SDK. Nothing failed when they drifted; the drift surfaced as
|
|
19
|
-
* `capability_scope_denied` on a grant the caller believed it held.
|
|
20
|
-
*
|
|
21
|
-
* Two axes decide blast radius. VERBS come from `can`; ROWS come from
|
|
22
|
-
* `syncGroups`. They belong to one grant, which is why they are declared
|
|
23
|
-
* together here rather than meeting for the first time on the wire.
|
|
24
|
-
*/
|
|
25
|
-
import { z } from 'zod';
|
|
26
|
-
import { participantKindSchema } from '../coordination/schema.js';
|
|
27
|
-
import { syncGroupInputSchema } from '../schema/roles.js';
|
|
28
|
-
/**
|
|
29
|
-
* The verbs a grant can name — the whole vocabulary, in one place. Every other
|
|
30
|
-
* spelling of an operation in the system derives from this enum: the SDK's
|
|
31
|
-
* `can` values, the wire's `model.verb` pattern, and the JSON Schema the
|
|
32
|
-
* published contract advertises.
|
|
33
|
-
*/
|
|
34
|
-
export const capabilityOperationSchema = z.enum(['read', 'create', 'update', 'delete']);
|
|
35
|
-
/**
|
|
36
|
-
* One granted operation in its wire spelling: `<model>.<verb>`, lowercased.
|
|
37
|
-
*
|
|
38
|
-
* The template literal derives both halves — the verb set from
|
|
39
|
-
* {@link capabilityOperationSchema}, the pattern in the published contract from
|
|
40
|
-
* the template — so tightening the verb vocabulary can never leave a stale
|
|
41
|
-
* regex or a stale doc behind. The model half is the name the server matches
|
|
42
|
-
* against a model's registered aliases (type name, schema key, or table name),
|
|
43
|
-
* so it stays permissive here and is resolved at the gate.
|
|
44
|
-
*/
|
|
45
|
-
export const grantedOperationSchema = z.templateLiteral([
|
|
46
|
-
z.string().regex(/^[^.\s]+$/),
|
|
47
|
-
'.',
|
|
48
|
-
capabilityOperationSchema,
|
|
49
|
-
]);
|
|
50
|
-
/**
|
|
51
|
-
* The declared grant, per model — the runtime shape of `can`. Model keys are
|
|
52
|
-
* free-form at runtime because the server resolves them against the schema it
|
|
53
|
-
* has; {@link CapabilityCan} narrows them to a known schema's models at the
|
|
54
|
-
* type level.
|
|
55
|
-
*/
|
|
56
|
-
export const capabilityCanSchema = z.record(z.string().min(1), z.array(capabilityOperationSchema).readonly());
|
|
57
|
-
/**
|
|
58
|
-
* Read-your-writes expansion: append `<model>.read` for every model the grant
|
|
59
|
-
* can write.
|
|
60
|
-
*
|
|
61
|
-
* A scoped agent that may update a row must be able to read it, or the read
|
|
62
|
-
* gate (query / bootstrap / entity self-heal / delta fan-out) starves the very
|
|
63
|
-
* writes the grant allows. The write verbs stay the source of truth; reads are
|
|
64
|
-
* derived and deduped, and models the grant cannot write stay unreadable —
|
|
65
|
-
* that is the read-side blast-radius reduction.
|
|
66
|
-
*
|
|
67
|
-
* It lives beside the declaration, so it applies wherever a grant is built,
|
|
68
|
-
* rather than only at whichever mint the callers happen to share. The server
|
|
69
|
-
* applies it again at the mint chokepoint for callers that post raw JSON; the
|
|
70
|
-
* function is idempotent, so the second application is a no-op.
|
|
71
|
-
*/
|
|
72
|
-
export function expandReadYourWrites(operations) {
|
|
73
|
-
const out = new Set(operations);
|
|
74
|
-
for (const op of operations) {
|
|
75
|
-
const [model] = op.split('.');
|
|
76
|
-
if (model)
|
|
77
|
-
out.add(`${model}.read`);
|
|
78
|
-
}
|
|
79
|
-
return [...out];
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Schema key → the wire name a grant must be minted with.
|
|
83
|
-
*
|
|
84
|
-
* THE derivation. A model whose type name is overridden — schema key
|
|
85
|
-
* `documents`, type name `Document` — has to mint `document.update`, not
|
|
86
|
-
* `documents.update`, and a caller who works that out by hand gets it wrong
|
|
87
|
-
* once and learns at `capability_scope_denied`. Callers pass their schema's
|
|
88
|
-
* models, never a map they assembled themselves.
|
|
89
|
-
*/
|
|
90
|
-
export function modelWireNames(models) {
|
|
91
|
-
return Object.fromEntries(Object.entries(models).map(([key, def]) => [key, def.typename ?? key]));
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Every name the enforcement gates accept for a model, lowercased. Three
|
|
95
|
-
* vocabularies name one logical model — the wire type name (`lineitem`), the
|
|
96
|
-
* schema key (`lineItems`), and the table name (`line_items`) — so a grant
|
|
97
|
-
* minted in any of them is honored, and the mint can tell a real model from a
|
|
98
|
-
* typo without guessing which vocabulary the caller used.
|
|
99
|
-
*/
|
|
100
|
-
export function capabilityModelAliases(models) {
|
|
101
|
-
const aliases = new Set();
|
|
102
|
-
for (const [key, def] of Object.entries(models)) {
|
|
103
|
-
aliases.add(key.toLowerCase());
|
|
104
|
-
if (def.typename)
|
|
105
|
-
aliases.add(def.typename.toLowerCase());
|
|
106
|
-
if (def.tableName)
|
|
107
|
-
aliases.add(def.tableName.toLowerCase());
|
|
108
|
-
}
|
|
109
|
-
return aliases;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* The granted operations whose model half names nothing in the schema.
|
|
113
|
-
*
|
|
114
|
-
* A grant is checked against the schema at MINT, the way a write to an unpushed
|
|
115
|
-
* model already fails with `server_execute_unknown_model` — so a typo in
|
|
116
|
-
* `lineitem.update` is a rejected mint rather than a credential that looks
|
|
117
|
-
* healthy and is denied on its first write. Without this the `model` half is a
|
|
118
|
-
* hole: an opaque string nothing validates until enforcement time.
|
|
119
|
-
*/
|
|
120
|
-
export function unresolvableOperations(operations, aliases) {
|
|
121
|
-
// The model half holds no dot (see `grantedOperationSchema`), so the first
|
|
122
|
-
// separator is the only one.
|
|
123
|
-
return operations.filter((op) => !aliases.has(op.slice(0, op.indexOf('.'))));
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Serializes a declared `can` into the wire allowlist — the ONE translation
|
|
127
|
-
* from what a developer writes to what the server stores and enforces.
|
|
128
|
-
*
|
|
129
|
-
* `wireNames` comes from {@link modelWireNames} over the client's own schema.
|
|
130
|
-
* It is required rather than optional: an omitted map silently mints the schema
|
|
131
|
-
* key verbatim, which is right for most models and wrong for every model with
|
|
132
|
-
* a type-name override — the kind of default that is correct until it isn't.
|
|
133
|
-
*/
|
|
134
|
-
export function grantedOperations(can, wireNames) {
|
|
135
|
-
const declared = Object.entries(can).flatMap(([model, ops]) => {
|
|
136
|
-
const wireName = (wireNames[model] ?? model).toLowerCase();
|
|
137
|
-
return (ops ?? []).map((op) => `${wireName}.${op}`);
|
|
138
|
-
});
|
|
139
|
-
return expandReadYourWrites(declared);
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* The grant at rest: what the credential ended up with, on both axes, plus the
|
|
143
|
-
* participant it acts as. The mint echoes this block, the key row stores it,
|
|
144
|
-
* and the gates read it — so a session's reported scope and its enforced scope
|
|
145
|
-
* are the same shape by construction.
|
|
146
|
-
*/
|
|
147
|
-
export const capabilityScopeSchema = z.object({
|
|
148
|
-
organizationId: z.string().min(1),
|
|
149
|
-
/**
|
|
150
|
-
* The ROW axis — which sync groups this credential may act within. Read back
|
|
151
|
-
* as plain strings rather than the branded form the request enforces: this is
|
|
152
|
-
* what the key row already holds, including rows minted before that gate.
|
|
153
|
-
*/
|
|
154
|
-
syncGroups: z.array(z.string()),
|
|
155
|
-
/** The VERB axis — the allowlist as minted, after read-your-writes. */
|
|
156
|
-
operations: z.array(grantedOperationSchema),
|
|
157
|
-
participantKind: participantKindSchema,
|
|
158
|
-
participantId: z.string().min(1),
|
|
159
|
-
});
|
|
160
|
-
/**
|
|
161
|
-
* `POST /v1/capabilities` — mint a capability for a participant.
|
|
162
|
-
*
|
|
163
|
-
* Where an ephemeral key is a session for a person, a capability is a scoped,
|
|
164
|
-
* revocable grant for an agent or a system. Narrow by default: an agent or
|
|
165
|
-
* system capability must name its `operations` unless the caller explicitly
|
|
166
|
-
* asks for `wideScope`, which is itself privileged.
|
|
167
|
-
*
|
|
168
|
-
* This is the parsed body — the mint route validates against it rather than
|
|
169
|
-
* reading fields one at a time, so the shape and the validation rules cannot
|
|
170
|
-
* drift from each other or from the published contract.
|
|
171
|
-
*/
|
|
172
|
-
export const capabilityRequestSchema = z.object({
|
|
173
|
-
participantKind: participantKindSchema,
|
|
174
|
-
participantId: z.string().min(1).optional(),
|
|
175
|
-
/**
|
|
176
|
-
* The ROW axis. Validated as the engine's branded sync-group form
|
|
177
|
-
* (`default` or `<namespace>:<id>`): a malformed group stored on the key row
|
|
178
|
-
* would subscribe the connection to NOTHING and fail silently at fan-out
|
|
179
|
-
* time, so it is rejected loudly at the boundary.
|
|
180
|
-
*/
|
|
181
|
-
syncGroups: z.array(syncGroupInputSchema).readonly().optional(),
|
|
182
|
-
/** The VERB axis, as `model.verb` — e.g. `tasks.update`. */
|
|
183
|
-
operations: z.array(grantedOperationSchema).readonly().optional(),
|
|
184
|
-
ttlSeconds: z.number().int().positive(),
|
|
185
|
-
label: z.string().min(1).optional(),
|
|
186
|
-
/**
|
|
187
|
-
* Opt out of narrow-by-default scoping. Without it, agent and system
|
|
188
|
-
* capabilities require non-empty `operations`; with it, the caller must
|
|
189
|
-
* additionally hold an admin/owner role or present a secret key.
|
|
190
|
-
*/
|
|
191
|
-
wideScope: z.boolean().optional(),
|
|
192
|
-
/**
|
|
193
|
-
* Caller-attested identity for the end user this capability acts for — the
|
|
194
|
-
* on-behalf-of pattern. Ablo does not validate it and has no view into the
|
|
195
|
-
* caller's user directory; the API key is what is trusted, and this blob is
|
|
196
|
-
* echoed back to the client.
|
|
197
|
-
*/
|
|
198
|
-
userMeta: z.record(z.string(), z.unknown()).optional(),
|
|
199
|
-
});
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Support for the endpoint-string form of `apiKey`.
|
|
3
|
-
*
|
|
4
|
-
* With `Ablo({ schema, apiKey: '/api/ablo-session' })`, you point the client at
|
|
5
|
-
* your own session-mint route and the client owns the exchange: it POSTs to the
|
|
6
|
-
* endpoint, parses the minted token, keeps it fresh, and classifies failures
|
|
7
|
-
* onto the resolver's three outcomes. The string form covers the common case;
|
|
8
|
-
* the function form of `apiKey` remains the escape hatch for custom headers,
|
|
9
|
-
* bodies, or non-HTTP mints.
|
|
10
|
-
*
|
|
11
|
-
* The form is detected by prefix: a string starting with `/`, `http://`, or
|
|
12
|
-
* `https://` is an endpoint, and anything else is a literal key. Ablo keys are
|
|
13
|
-
* prefixed (`sk_`/`pk_`/`ek_`/`rk_`), so the two shapes cannot collide. An
|
|
14
|
-
* `ABLO_API_KEY` environment value is never treated as an endpoint — it is
|
|
15
|
-
* always a literal key (see `resolveApiKey`).
|
|
16
|
-
*
|
|
17
|
-
* Wire contract:
|
|
18
|
-
* POST <endpoint> (same-origin, `credentials: 'include'` so cookies flow)
|
|
19
|
-
* → 200 `{ token, expiresAt? }` a fresh short-lived `ek_`/`rk_`
|
|
20
|
-
* → 200 `{ token: null }` or 401/403 the login itself is gone (sign out)
|
|
21
|
-
* → anything else transient — retry, do not sign out
|
|
22
|
-
*
|
|
23
|
-
* The three-way mapping is the reason to build this in. Hand-written token
|
|
24
|
-
* fetchers routinely get it wrong — mapping any non-OK response to `null` signs
|
|
25
|
-
* the user out on a 500. Encoded here once, every consumer inherits the correct
|
|
26
|
-
* split between a terminal sign-out and a transient retry.
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* An async callable that resolves the current credential. It serves two uses:
|
|
30
|
-
* credential rotation (for example against AWS STS, GCP IAM, or Vault) and the
|
|
31
|
-
* short-lived per-user browser path (minting a fresh `ek_`/`rk_` from the
|
|
32
|
-
* signed-in session). It is re-exported from `./auth` so existing import paths
|
|
33
|
-
* keep working, and defined here so the resolver it types has no import cycle.
|
|
34
|
-
*
|
|
35
|
-
* The contract has three outcomes: resolve a token; resolve `null` when the
|
|
36
|
-
* login itself is gone (terminal — the credential lifecycle treats this as
|
|
37
|
-
* `session_expired` and signs out); or throw on a transient failure (back off
|
|
38
|
-
* and retry, without signing out). A long-lived static `apiKey` string needs
|
|
39
|
-
* none of this and is used as-is.
|
|
40
|
-
*/
|
|
41
|
-
export type ApiKeySetter = () => Promise<string | null>;
|
|
42
|
-
/**
|
|
43
|
-
* Is this `apiKey` string a session-mint endpoint rather than a literal key?
|
|
44
|
-
* Prefix rule: `/relative/path`, `http://…`, or `https://…`.
|
|
45
|
-
*/
|
|
46
|
-
export declare function isCredentialEndpoint(value: string): boolean;
|
|
47
|
-
/**
|
|
48
|
-
* Builds the resolver behind an endpoint-string `apiKey`. It follows the
|
|
49
|
-
* {@link ApiKeySetter} contract end to end:
|
|
50
|
-
* - resolves the minted token string on success;
|
|
51
|
-
* - resolves `null` when the login is gone (a 401 or 403, or an explicit
|
|
52
|
-
* `{ token: null }`) — terminal, so the client signs out;
|
|
53
|
-
* - throws on anything transient (a network failure, a 5xx or 429, or a
|
|
54
|
-
* malformed response) — so the lifecycle backs off and retries without
|
|
55
|
-
* signing out.
|
|
56
|
-
*
|
|
57
|
-
* A relative endpoint invoked on a server (where `fetch` has no origin) throws,
|
|
58
|
-
* which is transient by contract; the credential lifecycle translates that exact
|
|
59
|
-
* failure into an actionable "use an absolute URL server-side" warning.
|
|
60
|
-
*/
|
|
61
|
-
export declare function createEndpointCredentialResolver(endpoint: string): ApiKeySetter;
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Support for the endpoint-string form of `apiKey`.
|
|
3
|
-
*
|
|
4
|
-
* With `Ablo({ schema, apiKey: '/api/ablo-session' })`, you point the client at
|
|
5
|
-
* your own session-mint route and the client owns the exchange: it POSTs to the
|
|
6
|
-
* endpoint, parses the minted token, keeps it fresh, and classifies failures
|
|
7
|
-
* onto the resolver's three outcomes. The string form covers the common case;
|
|
8
|
-
* the function form of `apiKey` remains the escape hatch for custom headers,
|
|
9
|
-
* bodies, or non-HTTP mints.
|
|
10
|
-
*
|
|
11
|
-
* The form is detected by prefix: a string starting with `/`, `http://`, or
|
|
12
|
-
* `https://` is an endpoint, and anything else is a literal key. Ablo keys are
|
|
13
|
-
* prefixed (`sk_`/`pk_`/`ek_`/`rk_`), so the two shapes cannot collide. An
|
|
14
|
-
* `ABLO_API_KEY` environment value is never treated as an endpoint — it is
|
|
15
|
-
* always a literal key (see `resolveApiKey`).
|
|
16
|
-
*
|
|
17
|
-
* Wire contract:
|
|
18
|
-
* POST <endpoint> (same-origin, `credentials: 'include'` so cookies flow)
|
|
19
|
-
* → 200 `{ token, expiresAt? }` a fresh short-lived `ek_`/`rk_`
|
|
20
|
-
* → 200 `{ token: null }` or 401/403 the login itself is gone (sign out)
|
|
21
|
-
* → anything else transient — retry, do not sign out
|
|
22
|
-
*
|
|
23
|
-
* The three-way mapping is the reason to build this in. Hand-written token
|
|
24
|
-
* fetchers routinely get it wrong — mapping any non-OK response to `null` signs
|
|
25
|
-
* the user out on a 500. Encoded here once, every consumer inherits the correct
|
|
26
|
-
* split between a terminal sign-out and a transient retry.
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* Is this `apiKey` string a session-mint endpoint rather than a literal key?
|
|
30
|
-
* Prefix rule: `/relative/path`, `http://…`, or `https://…`.
|
|
31
|
-
*/
|
|
32
|
-
export function isCredentialEndpoint(value) {
|
|
33
|
-
return value.startsWith('/') || /^https?:\/\//i.test(value);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Builds the resolver behind an endpoint-string `apiKey`. It follows the
|
|
37
|
-
* {@link ApiKeySetter} contract end to end:
|
|
38
|
-
* - resolves the minted token string on success;
|
|
39
|
-
* - resolves `null` when the login is gone (a 401 or 403, or an explicit
|
|
40
|
-
* `{ token: null }`) — terminal, so the client signs out;
|
|
41
|
-
* - throws on anything transient (a network failure, a 5xx or 429, or a
|
|
42
|
-
* malformed response) — so the lifecycle backs off and retries without
|
|
43
|
-
* signing out.
|
|
44
|
-
*
|
|
45
|
-
* A relative endpoint invoked on a server (where `fetch` has no origin) throws,
|
|
46
|
-
* which is transient by contract; the credential lifecycle translates that exact
|
|
47
|
-
* failure into an actionable "use an absolute URL server-side" warning.
|
|
48
|
-
*/
|
|
49
|
-
export function createEndpointCredentialResolver(endpoint) {
|
|
50
|
-
return async () => {
|
|
51
|
-
// `fetch()` rejections (offline, DNS, a relative URL on a server) propagate
|
|
52
|
-
// as-is: a throw is the transient signal in the resolver contract.
|
|
53
|
-
const res = await fetch(endpoint, {
|
|
54
|
-
method: 'POST',
|
|
55
|
-
credentials: 'include',
|
|
56
|
-
});
|
|
57
|
-
// The login itself is gone — terminal. Only these two statuses sign out.
|
|
58
|
-
if (res.status === 401 || res.status === 403)
|
|
59
|
-
return null;
|
|
60
|
-
// 5xx / 429 / anything unexpected: the login may be perfectly valid —
|
|
61
|
-
// transient, retry later.
|
|
62
|
-
if (!res.ok) {
|
|
63
|
-
throw new Error(`credential endpoint ${endpoint} answered ${res.status} — transient, will retry`);
|
|
64
|
-
}
|
|
65
|
-
let body;
|
|
66
|
-
try {
|
|
67
|
-
body = await res.json();
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
throw new Error(`credential endpoint ${endpoint} returned non-JSON — expected { token }`);
|
|
71
|
-
}
|
|
72
|
-
// Distinguish "explicitly signed out" (`{ token: null }`) from "not a mint
|
|
73
|
-
// endpoint at all" (no `token` key). A misconfiguration must fail loudly and
|
|
74
|
-
// transiently, never as a silent sign-out.
|
|
75
|
-
if (typeof body !== 'object' || body === null || !('token' in body)) {
|
|
76
|
-
throw new Error(`credential endpoint ${endpoint} returned no \`token\` field — expected { token }`);
|
|
77
|
-
}
|
|
78
|
-
const token = body.token;
|
|
79
|
-
if (token === null || token === undefined)
|
|
80
|
-
return null;
|
|
81
|
-
if (typeof token !== 'string') {
|
|
82
|
-
throw new Error(`credential endpoint ${endpoint} returned a non-string \`token\``);
|
|
83
|
-
}
|
|
84
|
-
return token;
|
|
85
|
-
};
|
|
86
|
-
}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Decides what a credential is and how to use it when a client connects. A
|
|
3
|
-
* caller configures an Ablo client with an API key, and this module answers two
|
|
4
|
-
* questions about that value: which of the four key kinds it is, and which
|
|
5
|
-
* connect-time route it takes.
|
|
6
|
-
*
|
|
7
|
-
* The routing decision is the only thing that lives here. This module does not
|
|
8
|
-
* perform the network calls that mint or exchange credentials;
|
|
9
|
-
* {@link resolveCredential} delegates those to primitives the caller supplies,
|
|
10
|
-
* so the decision of what to do stays separate from the work of doing it.
|
|
11
|
-
*
|
|
12
|
-
* {@link classifyCredentialKind} is a plain string check with no Node
|
|
13
|
-
* dependencies, so it is safe to run in a browser bundle. It recognizes the key
|
|
14
|
-
* prefixes `sk_` (secret), `rk_` (restricted), `ek_` (ephemeral), and `pk_`
|
|
15
|
-
* (publishable), but does not validate a key's checksum or environment segment.
|
|
16
|
-
*/
|
|
17
|
-
import type { exchangeApiKey, mintUserSessionKey, resolveIdentity } from './index.js';
|
|
18
|
-
/**
|
|
19
|
-
* The shape of the function that resolves a configured `apiKey` — which may be a
|
|
20
|
-
* string or an async setter — down to a concrete string, or `null` when no key
|
|
21
|
-
* is available. It is declared here structurally, rather than imported, to avoid
|
|
22
|
-
* a circular dependency between this module and the code that supplies the
|
|
23
|
-
* function. Any function with a matching shape satisfies it.
|
|
24
|
-
*/
|
|
25
|
-
type ResolveApiKeyValueFn = (apiKey: string | (() => Promise<string | null>) | null) => Promise<string | null>;
|
|
26
|
-
/**
|
|
27
|
-
* The four kinds of Ablo API key, one per prefix: `sk_` is secret, `ek_` is
|
|
28
|
-
* ephemeral, `rk_` is restricted, and `pk_` is publishable. The list is declared
|
|
29
|
-
* here, rather than imported, so this browser-safe module stays free of Node-only
|
|
30
|
-
* dependencies.
|
|
31
|
-
*/
|
|
32
|
-
export type CredentialKind = 'secret' | 'ephemeral' | 'restricted' | 'publishable';
|
|
33
|
-
/**
|
|
34
|
-
* Classifies a credential by its prefix, returning its {@link CredentialKind}, or
|
|
35
|
-
* `null` when the value carries no recognized Ablo key prefix — for example a
|
|
36
|
-
* capability or auth token the caller supplied, or an empty string. This is a
|
|
37
|
-
* plain string check that is safe to run in a browser; it decides only which of
|
|
38
|
-
* the four kinds a value is, and does not validate the key's checksum or
|
|
39
|
-
* environment segment.
|
|
40
|
-
*/
|
|
41
|
-
export declare function classifyCredentialKind(value: string): CredentialKind | null;
|
|
42
|
-
/**
|
|
43
|
-
* The set of authentication primitives that {@link resolveCredential} delegates
|
|
44
|
-
* to. Injecting them keeps the network calls that mint and exchange credentials
|
|
45
|
-
* in one place and leaves this module responsible only for the routing decision.
|
|
46
|
-
* {@link resolveCredential} never calls `mintUserSessionKey` itself — an
|
|
47
|
-
* ephemeral `ek_` key is minted before the client connects and arrives ready to
|
|
48
|
-
* use — but it is listed here to describe the full primitive surface.
|
|
49
|
-
*/
|
|
50
|
-
export interface CredentialPrimitives {
|
|
51
|
-
readonly exchangeApiKey: typeof exchangeApiKey;
|
|
52
|
-
readonly mintUserSessionKey: typeof mintUserSessionKey;
|
|
53
|
-
readonly resolveIdentity: typeof resolveIdentity;
|
|
54
|
-
readonly resolveApiKeyValue: ResolveApiKeyValueFn;
|
|
55
|
-
}
|
|
56
|
-
export interface ResolveCredentialContext {
|
|
57
|
-
readonly primitives: CredentialPrimitives;
|
|
58
|
-
/**
|
|
59
|
-
* The arguments for the credential exchange, minus the `apiKey`. The caller
|
|
60
|
-
* derives the base URL and participant scope and supplies them here;
|
|
61
|
-
* {@link resolveCredential} fills in the resolved `apiKey` and calls
|
|
62
|
-
* `exchangeApiKey`.
|
|
63
|
-
*/
|
|
64
|
-
readonly exchangeArgs: Omit<Parameters<typeof exchangeApiKey>[0], 'apiKey'>;
|
|
65
|
-
}
|
|
66
|
-
export interface ResolveCredentialInput {
|
|
67
|
-
/** Resolved string value of the configured `apiKey` (callable already invoked), or null. */
|
|
68
|
-
readonly apiKeyValue: string | null;
|
|
69
|
-
/** The configured `apiKey` (string or setter) — threaded onto the refresh path. */
|
|
70
|
-
readonly configuredApiKey: string | (() => Promise<string | null>) | null;
|
|
71
|
-
/** Explicit caller-supplied capability token (`options.capabilityToken`). */
|
|
72
|
-
readonly capabilityToken: string | undefined;
|
|
73
|
-
/** Configured static `authToken`. */
|
|
74
|
-
readonly authToken: string | null;
|
|
75
|
-
/** True when the caller already knows its own identity, so no server round-trip is needed to resolve it. */
|
|
76
|
-
readonly hasExplicitIdentity: boolean;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* The outcome of the connect-time decision, as a discriminated union over the
|
|
80
|
-
* route rather than the key kind: an `ek_` and an `rk_` key both take the
|
|
81
|
-
* `pre-minted` route, as does a bare capability token. The caller switches on
|
|
82
|
-
* `kind` and wires up the scope and side effects each route needs.
|
|
83
|
-
*
|
|
84
|
-
* Every variant carries the same three fields:
|
|
85
|
-
* - `getBearer` — the token used to authenticate the bootstrap and `/auth/*`
|
|
86
|
-
* requests, and to seed the credential source.
|
|
87
|
-
* - `expiresAtMs` — when the credential expires, which drives the refresh
|
|
88
|
-
* scheduler, or `null` when there is nothing to refresh.
|
|
89
|
-
* - `controlPlaneKey` — the original configured API key when the route minted
|
|
90
|
-
* its bearer through an exchange, so a refresh can mint again; otherwise
|
|
91
|
-
* `null`.
|
|
92
|
-
*/
|
|
93
|
-
export type ResolvedCredential =
|
|
94
|
-
/** `pk_` — long-lived browser-safe read-only project key. Used directly as the
|
|
95
|
-
* bearer; never exchanged, never refreshed. Identity resolved via `/auth/identity`. */
|
|
96
|
-
{
|
|
97
|
-
readonly kind: 'publishable';
|
|
98
|
-
readonly getBearer: string;
|
|
99
|
-
readonly expiresAtMs: null;
|
|
100
|
-
readonly controlPlaneKey: null;
|
|
101
|
-
}
|
|
102
|
-
/** `sk_` (no explicit cap token) — hosted-cloud. Exchanged for a capability
|
|
103
|
-
* token via `exchangeApiKey`; the refresh scheduler re-mints before expiry. */
|
|
104
|
-
| {
|
|
105
|
-
readonly kind: 'exchange';
|
|
106
|
-
/** Result of the initial `exchangeApiKey` call. */
|
|
107
|
-
readonly exchange: Awaited<ReturnType<typeof exchangeApiKey>>;
|
|
108
|
-
readonly getBearer: string;
|
|
109
|
-
readonly expiresAtMs: number;
|
|
110
|
-
/** The configured apiKey (string or setter) — read fresh on each refresh. */
|
|
111
|
-
readonly controlPlaneKey: string | (() => Promise<string | null>);
|
|
112
|
-
}
|
|
113
|
-
/** A pre-minted `ek_` or `rk_` key, or an explicit capability or auth token,
|
|
114
|
-
* used as the bearer without any exchange. Identity resolved via `/auth/identity`. */
|
|
115
|
-
| {
|
|
116
|
-
readonly kind: 'pre-minted';
|
|
117
|
-
readonly getBearer: string;
|
|
118
|
-
readonly expiresAtMs: null;
|
|
119
|
-
readonly controlPlaneKey: null;
|
|
120
|
-
}
|
|
121
|
-
/** The caller already knows its own organization and user or agent id, so there
|
|
122
|
-
* is no server round-trip; the optional bearer is the initial capability token. */
|
|
123
|
-
| {
|
|
124
|
-
readonly kind: 'explicit';
|
|
125
|
-
readonly getBearer: string | undefined;
|
|
126
|
-
readonly expiresAtMs: null;
|
|
127
|
-
readonly controlPlaneKey: null;
|
|
128
|
-
};
|
|
129
|
-
/**
|
|
130
|
-
* Routes a configured API key to its connect-time outcome. It classifies the
|
|
131
|
-
* key, then returns one of four {@link ResolvedCredential} variants, delegating
|
|
132
|
-
* any credential exchange to the injected `exchangeApiKey` primitive. The caller
|
|
133
|
-
* switches on the result's `kind` to wire up scope and the refresh scheduler.
|
|
134
|
-
*
|
|
135
|
-
* The routes, in the order they are tried:
|
|
136
|
-
* 0. A `pk_` key with no explicit capability token becomes `publishable`: used
|
|
137
|
-
* directly as the bearer, with no refresh.
|
|
138
|
-
* 1. Any other exchangeable key (one that is not a pre-minted `ek_` or `rk_`)
|
|
139
|
-
* with no explicit capability token becomes `exchange`: a round-trip mints a
|
|
140
|
-
* capability token, and the refresh scheduler renews it before it expires.
|
|
141
|
-
* 2. Otherwise, when the caller's identity is not yet known, the result is
|
|
142
|
-
* `pre-minted`: the capability token is used as-is. Throws `session_expired`
|
|
143
|
-
* when there is no token to authenticate `/auth/identity`.
|
|
144
|
-
* 3. Otherwise, when the caller already knows its identity, the result is
|
|
145
|
-
* `explicit`, with no round-trip.
|
|
146
|
-
*/
|
|
147
|
-
export declare function resolveCredential(input: ResolveCredentialInput, ctx: ResolveCredentialContext): Promise<ResolvedCredential>;
|
|
148
|
-
export {};
|