@abloatai/transaction 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/CONVENTIONS.md +83 -0
- package/README.md +48 -0
- package/dist/ablo.d.ts +90 -0
- package/dist/ablo.d.ts.map +1 -0
- package/dist/ablo.js +34 -0
- package/dist/ablo.js.map +1 -0
- package/dist/ai-sdk/coordinatedTool.d.ts +123 -0
- package/dist/ai-sdk/coordinatedTool.d.ts.map +1 -0
- package/dist/ai-sdk/coordinatedTool.js +135 -0
- package/dist/ai-sdk/coordinatedTool.js.map +1 -0
- package/dist/ai-sdk/index.d.ts +2 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +2 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/auth/apiKey.d.ts +154 -0
- package/dist/auth/apiKey.d.ts.map +1 -0
- package/dist/auth/apiKey.js +408 -0
- package/dist/auth/apiKey.js.map +1 -0
- package/dist/auth/bootstrapScope.d.ts +16 -0
- package/dist/auth/bootstrapScope.d.ts.map +1 -0
- package/dist/auth/bootstrapScope.js +2 -0
- package/dist/auth/bootstrapScope.js.map +1 -0
- package/dist/auth/browserCredentialSafety.d.ts +7 -0
- package/dist/auth/browserCredentialSafety.d.ts.map +1 -0
- package/dist/auth/browserCredentialSafety.js +29 -0
- package/dist/auth/browserCredentialSafety.js.map +1 -0
- package/dist/auth/capability.d.ts +241 -0
- package/dist/auth/capability.d.ts.map +1 -0
- package/dist/auth/capability.js +253 -0
- package/dist/auth/capability.js.map +1 -0
- package/dist/auth/capabilityLifecycle.d.ts +47 -0
- package/dist/auth/capabilityLifecycle.d.ts.map +1 -0
- package/dist/auth/capabilityLifecycle.js +108 -0
- package/dist/auth/capabilityLifecycle.js.map +1 -0
- package/dist/auth/credentialEndpoint.d.ts +10 -0
- package/dist/auth/credentialEndpoint.d.ts.map +1 -0
- package/dist/auth/credentialEndpoint.js +58 -0
- package/dist/auth/credentialEndpoint.js.map +1 -0
- package/dist/auth/credentialEndpointProtocol.d.ts +24 -0
- package/dist/auth/credentialEndpointProtocol.d.ts.map +1 -0
- package/dist/auth/credentialEndpointProtocol.js +34 -0
- package/dist/auth/credentialEndpointProtocol.js.map +1 -0
- package/dist/auth/credentialKind.d.ts +4 -0
- package/dist/auth/credentialKind.d.ts.map +1 -0
- package/dist/auth/credentialKind.js +15 -0
- package/dist/auth/credentialKind.js.map +1 -0
- package/dist/auth/credentialPolicy.d.ts +141 -0
- package/dist/auth/credentialPolicy.d.ts.map +1 -0
- package/dist/auth/credentialPolicy.js +113 -0
- package/dist/auth/credentialPolicy.js.map +1 -0
- package/dist/auth/credentialResult.d.ts +7 -0
- package/dist/auth/credentialResult.d.ts.map +1 -0
- package/dist/auth/credentialResult.js +9 -0
- package/dist/auth/credentialResult.js.map +1 -0
- package/dist/auth/credentialSource.d.ts +31 -0
- package/dist/auth/credentialSource.d.ts.map +1 -0
- package/dist/auth/credentialSource.js +56 -0
- package/dist/auth/credentialSource.js.map +1 -0
- package/dist/auth/hostedEndpoints.d.ts +22 -0
- package/dist/auth/hostedEndpoints.d.ts.map +1 -0
- package/dist/auth/hostedEndpoints.js +22 -0
- package/dist/auth/hostedEndpoints.js.map +1 -0
- package/dist/auth/identity.d.ts +62 -0
- package/dist/auth/identity.d.ts.map +1 -0
- package/dist/auth/identity.js +224 -0
- package/dist/auth/identity.js.map +1 -0
- package/dist/auth/index.d.ts +189 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +312 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/schemas.d.ts +41 -0
- package/dist/auth/schemas.d.ts.map +1 -0
- package/dist/auth/schemas.js +69 -0
- package/dist/auth/schemas.js.map +1 -0
- package/dist/auth/sessionMint.d.ts +29 -0
- package/dist/auth/sessionMint.d.ts.map +1 -0
- package/dist/auth/sessionMint.js +92 -0
- package/dist/auth/sessionMint.js.map +1 -0
- package/dist/auth/token.d.ts +4 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +4 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/batching/index.d.ts +56 -0
- package/dist/batching/index.d.ts.map +1 -0
- package/dist/batching/index.js +148 -0
- package/dist/batching/index.js.map +1 -0
- package/dist/coordination/awaitClaimGrant.d.ts +57 -0
- package/dist/coordination/awaitClaimGrant.d.ts.map +1 -0
- package/dist/coordination/awaitClaimGrant.js +138 -0
- package/dist/coordination/awaitClaimGrant.js.map +1 -0
- package/dist/coordination/claimHeartbeatLoop.d.ts +85 -0
- package/dist/coordination/claimHeartbeatLoop.d.ts.map +1 -0
- package/dist/coordination/claimHeartbeatLoop.js +109 -0
- package/dist/coordination/claimHeartbeatLoop.js.map +1 -0
- package/dist/coordination/claimMeta.d.ts +50 -0
- package/dist/coordination/claimMeta.d.ts.map +1 -0
- package/dist/coordination/claimMeta.js +53 -0
- package/dist/coordination/claimMeta.js.map +1 -0
- package/dist/coordination/events.d.ts +75 -0
- package/dist/coordination/events.d.ts.map +1 -0
- package/dist/coordination/events.js +8 -0
- package/dist/coordination/events.js.map +1 -0
- package/dist/coordination/index.d.ts +20 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +46 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/locator.d.ts +106 -0
- package/dist/coordination/locator.d.ts.map +1 -0
- package/dist/coordination/locator.js +110 -0
- package/dist/coordination/locator.js.map +1 -0
- package/dist/coordination/schema.d.ts +1332 -0
- package/dist/coordination/schema.d.ts.map +1 -0
- package/dist/coordination/schema.js +1137 -0
- package/dist/coordination/schema.js.map +1 -0
- package/dist/coordination/targetConflict.d.ts +3 -0
- package/dist/coordination/targetConflict.d.ts.map +1 -0
- package/dist/coordination/targetConflict.js +74 -0
- package/dist/coordination/targetConflict.js.map +1 -0
- package/dist/coordination/trace.d.ts +79 -0
- package/dist/coordination/trace.d.ts.map +1 -0
- package/dist/coordination/trace.js +139 -0
- package/dist/coordination/trace.js.map +1 -0
- package/dist/docs/catalog.d.ts +73 -0
- package/dist/docs/catalog.d.ts.map +1 -0
- package/dist/docs/catalog.js +231 -0
- package/dist/docs/catalog.js.map +1 -0
- package/dist/docs/index.d.ts +11 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +11 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/durableWrites.d.ts +63 -0
- package/dist/durableWrites.d.ts.map +1 -0
- package/dist/durableWrites.js +72 -0
- package/dist/durableWrites.js.map +1 -0
- package/dist/environment.d.ts +106 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +109 -0
- package/dist/environment.js.map +1 -0
- package/dist/errorCodes.d.ts +411 -0
- package/dist/errorCodes.d.ts.map +1 -0
- package/dist/errorCodes.js +500 -0
- package/dist/errorCodes.js.map +1 -0
- package/dist/errors.d.ts +429 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +687 -0
- package/dist/errors.js.map +1 -0
- package/dist/footprint.d.ts +112 -0
- package/dist/footprint.d.ts.map +1 -0
- package/dist/footprint.js +0 -0
- package/dist/footprint.js.map +1 -0
- package/dist/headlessClient.d.ts +10 -0
- package/dist/headlessClient.d.ts.map +1 -0
- package/dist/headlessClient.js +114 -0
- package/dist/headlessClient.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/keys/index.d.ts +88 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +208 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/log/syncDeltaRow.d.ts +159 -0
- package/dist/log/syncDeltaRow.d.ts.map +1 -0
- package/dist/log/syncDeltaRow.js +96 -0
- package/dist/log/syncDeltaRow.js.map +1 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +8 -0
- package/dist/logger.js.map +1 -0
- package/dist/observability.d.ts +54 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +20 -0
- package/dist/observability.js.map +1 -0
- package/dist/policy/types.d.ts +218 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +127 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/resources/functionalUpdate.d.ts +80 -0
- package/dist/resources/functionalUpdate.d.ts.map +1 -0
- package/dist/resources/functionalUpdate.js +88 -0
- package/dist/resources/functionalUpdate.js.map +1 -0
- package/dist/resources/httpResources.d.ts +449 -0
- package/dist/resources/httpResources.d.ts.map +1 -0
- package/dist/resources/httpResources.js +8 -0
- package/dist/resources/httpResources.js.map +1 -0
- package/dist/resources/modelOperations.d.ts +380 -0
- package/dist/resources/modelOperations.d.ts.map +1 -0
- package/dist/resources/modelOperations.js +13 -0
- package/dist/resources/modelOperations.js.map +1 -0
- package/dist/resources/mutationOptions.d.ts +67 -0
- package/dist/resources/mutationOptions.d.ts.map +1 -0
- package/dist/resources/mutationOptions.js +10 -0
- package/dist/resources/mutationOptions.js.map +1 -0
- package/dist/resources/where.d.ts +102 -0
- package/dist/resources/where.d.ts.map +1 -0
- package/dist/resources/where.js +116 -0
- package/dist/resources/where.js.map +1 -0
- package/dist/resources/writeOptionsSchema.d.ts +48 -0
- package/dist/resources/writeOptionsSchema.d.ts.map +1 -0
- package/dist/resources/writeOptionsSchema.js +74 -0
- package/dist/resources/writeOptionsSchema.js.map +1 -0
- package/dist/schema/coordination.d.ts +113 -0
- package/dist/schema/coordination.d.ts.map +1 -0
- package/dist/schema/coordination.js +134 -0
- package/dist/schema/coordination.js.map +1 -0
- package/dist/schema/ddl.d.ts +98 -0
- package/dist/schema/ddl.d.ts.map +1 -0
- package/dist/schema/ddl.js +492 -0
- package/dist/schema/ddl.js.map +1 -0
- package/dist/schema/ddlLock.d.ts +36 -0
- package/dist/schema/ddlLock.d.ts.map +1 -0
- package/dist/schema/ddlLock.js +47 -0
- package/dist/schema/ddlLock.js.map +1 -0
- package/dist/schema/diff.d.ts +226 -0
- package/dist/schema/diff.d.ts.map +1 -0
- package/dist/schema/diff.js +290 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/field.d.ts +121 -0
- package/dist/schema/field.d.ts.map +1 -0
- package/dist/schema/field.js +266 -0
- package/dist/schema/field.js.map +1 -0
- package/dist/schema/fieldRef.d.ts +58 -0
- package/dist/schema/fieldRef.d.ts.map +1 -0
- package/dist/schema/fieldRef.js +26 -0
- package/dist/schema/fieldRef.js.map +1 -0
- package/dist/schema/generate.d.ts +20 -0
- package/dist/schema/generate.d.ts.map +1 -0
- package/dist/schema/generate.js +87 -0
- package/dist/schema/generate.js.map +1 -0
- package/dist/schema/index.d.ts +43 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +81 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/loadStrategy.d.ts +46 -0
- package/dist/schema/loadStrategy.d.ts.map +1 -0
- package/dist/schema/loadStrategy.js +47 -0
- package/dist/schema/loadStrategy.js.map +1 -0
- package/dist/schema/model.d.ts +380 -0
- package/dist/schema/model.d.ts.map +1 -0
- package/dist/schema/model.js +124 -0
- package/dist/schema/model.js.map +1 -0
- package/dist/schema/openapi.d.ts +59 -0
- package/dist/schema/openapi.d.ts.map +1 -0
- package/dist/schema/openapi.js +508 -0
- package/dist/schema/openapi.js.map +1 -0
- package/dist/schema/queries.d.ts +202 -0
- package/dist/schema/queries.d.ts.map +1 -0
- package/dist/schema/queries.js +144 -0
- package/dist/schema/queries.js.map +1 -0
- package/dist/schema/relation.d.ts +205 -0
- package/dist/schema/relation.d.ts.map +1 -0
- package/dist/schema/relation.js +105 -0
- package/dist/schema/relation.js.map +1 -0
- package/dist/schema/residency.d.ts +30 -0
- package/dist/schema/residency.d.ts.map +1 -0
- package/dist/schema/residency.js +26 -0
- package/dist/schema/residency.js.map +1 -0
- package/dist/schema/roles.d.ts +250 -0
- package/dist/schema/roles.d.ts.map +1 -0
- package/dist/schema/roles.js +231 -0
- package/dist/schema/roles.js.map +1 -0
- package/dist/schema/schema.d.ts +352 -0
- package/dist/schema/schema.d.ts.map +1 -0
- package/dist/schema/schema.js +326 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/select.d.ts +41 -0
- package/dist/schema/select.d.ts.map +1 -0
- package/dist/schema/select.js +91 -0
- package/dist/schema/select.js.map +1 -0
- package/dist/schema/serialize.d.ts +116 -0
- package/dist/schema/serialize.d.ts.map +1 -0
- package/dist/schema/serialize.js +278 -0
- package/dist/schema/serialize.js.map +1 -0
- package/dist/schema/sugar.d.ts +110 -0
- package/dist/schema/sugar.d.ts.map +1 -0
- package/dist/schema/sugar.js +84 -0
- package/dist/schema/sugar.js.map +1 -0
- package/dist/schema/tenancy.d.ts +140 -0
- package/dist/schema/tenancy.d.ts.map +1 -0
- package/dist/schema/tenancy.js +191 -0
- package/dist/schema/tenancy.js.map +1 -0
- package/dist/server/adapter.d.ts +174 -0
- package/dist/server/adapter.d.ts.map +1 -0
- package/dist/server/adapter.js +19 -0
- package/dist/server/adapter.js.map +1 -0
- package/dist/server/commit.d.ts +108 -0
- package/dist/server/commit.d.ts.map +1 -0
- package/dist/server/commit.js +2 -0
- package/dist/server/commit.js.map +1 -0
- package/dist/server/index.d.ts +15 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/readConfig.d.ts +81 -0
- package/dist/server/readConfig.d.ts.map +1 -0
- package/dist/server/readConfig.js +9 -0
- package/dist/server/readConfig.js.map +1 -0
- package/dist/server/storageMode.d.ts +24 -0
- package/dist/server/storageMode.d.ts.map +1 -0
- package/dist/server/storageMode.js +18 -0
- package/dist/server/storageMode.js.map +1 -0
- package/dist/source/adapter.d.ts +84 -0
- package/dist/source/adapter.d.ts.map +1 -0
- package/dist/source/adapter.js +25 -0
- package/dist/source/adapter.js.map +1 -0
- package/dist/source/adapters/drizzle.d.ts +49 -0
- package/dist/source/adapters/drizzle.d.ts.map +1 -0
- package/dist/source/adapters/drizzle.js +220 -0
- package/dist/source/adapters/drizzle.js.map +1 -0
- package/dist/source/adapters/kysely.d.ts +43 -0
- package/dist/source/adapters/kysely.d.ts.map +1 -0
- package/dist/source/adapters/kysely.js +206 -0
- package/dist/source/adapters/kysely.js.map +1 -0
- package/dist/source/adapters/kyselyMutationCore.d.ts +77 -0
- package/dist/source/adapters/kyselyMutationCore.d.ts.map +1 -0
- package/dist/source/adapters/kyselyMutationCore.js +126 -0
- package/dist/source/adapters/kyselyMutationCore.js.map +1 -0
- package/dist/source/adapters/memory.d.ts +14 -0
- package/dist/source/adapters/memory.d.ts.map +1 -0
- package/dist/source/adapters/memory.js +131 -0
- package/dist/source/adapters/memory.js.map +1 -0
- package/dist/source/adapters/prisma.d.ts +64 -0
- package/dist/source/adapters/prisma.d.ts.map +1 -0
- package/dist/source/adapters/prisma.js +203 -0
- package/dist/source/adapters/prisma.js.map +1 -0
- package/dist/source/conformance.d.ts +38 -0
- package/dist/source/conformance.d.ts.map +1 -0
- package/dist/source/conformance.js +216 -0
- package/dist/source/conformance.js.map +1 -0
- package/dist/source/connector.d.ts +96 -0
- package/dist/source/connector.d.ts.map +1 -0
- package/dist/source/connector.js +267 -0
- package/dist/source/connector.js.map +1 -0
- package/dist/source/connectorProtocol.d.ts +155 -0
- package/dist/source/connectorProtocol.d.ts.map +1 -0
- package/dist/source/connectorProtocol.js +164 -0
- package/dist/source/connectorProtocol.js.map +1 -0
- package/dist/source/contract.d.ts +196 -0
- package/dist/source/contract.d.ts.map +1 -0
- package/dist/source/contract.js +165 -0
- package/dist/source/contract.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/factory.d.ts +93 -0
- package/dist/source/factory.d.ts.map +1 -0
- package/dist/source/factory.js +287 -0
- package/dist/source/factory.js.map +1 -0
- package/dist/source/idempotency.d.ts +62 -0
- package/dist/source/idempotency.d.ts.map +1 -0
- package/dist/source/idempotency.js +145 -0
- package/dist/source/idempotency.js.map +1 -0
- package/dist/source/index.d.ts +24 -0
- package/dist/source/index.d.ts.map +1 -0
- package/dist/source/index.js +29 -0
- package/dist/source/index.js.map +1 -0
- package/dist/source/kysely.d.ts +3 -0
- package/dist/source/kysely.d.ts.map +1 -0
- package/dist/source/kysely.js +3 -0
- package/dist/source/kysely.js.map +1 -0
- package/dist/source/migrations.d.ts +22 -0
- package/dist/source/migrations.d.ts.map +1 -0
- package/dist/source/migrations.js +104 -0
- package/dist/source/migrations.js.map +1 -0
- package/dist/source/next.d.ts +33 -0
- package/dist/source/next.d.ts.map +1 -0
- package/dist/source/next.js +26 -0
- package/dist/source/next.js.map +1 -0
- package/dist/source/pushQueue.d.ts +135 -0
- package/dist/source/pushQueue.d.ts.map +1 -0
- package/dist/source/pushQueue.js +257 -0
- package/dist/source/pushQueue.js.map +1 -0
- package/dist/source/signing.d.ts +93 -0
- package/dist/source/signing.d.ts.map +1 -0
- package/dist/source/signing.js +163 -0
- package/dist/source/signing.js.map +1 -0
- package/dist/source/types.d.ts +402 -0
- package/dist/source/types.d.ts.map +1 -0
- package/dist/source/types.js +60 -0
- package/dist/source/types.js.map +1 -0
- package/dist/syncLog/contract.d.ts +21 -0
- package/dist/syncLog/contract.d.ts.map +1 -0
- package/dist/syncLog/contract.js +20 -0
- package/dist/syncLog/contract.js.map +1 -0
- package/dist/syncLog/index.d.ts +2 -0
- package/dist/syncLog/index.d.ts.map +1 -0
- package/dist/syncLog/index.js +2 -0
- package/dist/syncLog/index.js.map +1 -0
- package/dist/testing/fixtures/httpResponses.d.ts +74 -0
- package/dist/testing/fixtures/httpResponses.d.ts.map +1 -0
- package/dist/testing/fixtures/httpResponses.js +102 -0
- package/dist/testing/fixtures/httpResponses.js.map +1 -0
- package/dist/transactionLayer.d.ts +110 -0
- package/dist/transactionLayer.d.ts.map +1 -0
- package/dist/transactionLayer.js +25 -0
- package/dist/transactionLayer.js.map +1 -0
- package/dist/transactions/settlement/commitEnvelope.d.ts +144 -0
- package/dist/transactions/settlement/commitEnvelope.d.ts.map +1 -0
- package/dist/transactions/settlement/commitEnvelope.js +162 -0
- package/dist/transactions/settlement/commitEnvelope.js.map +1 -0
- package/dist/transactions/settlement/httpCommitEnvelope.d.ts +54 -0
- package/dist/transactions/settlement/httpCommitEnvelope.d.ts.map +1 -0
- package/dist/transactions/settlement/httpCommitEnvelope.js +208 -0
- package/dist/transactions/settlement/httpCommitEnvelope.js.map +1 -0
- package/dist/transactions/settlement/idempotencyKey.d.ts +11 -0
- package/dist/transactions/settlement/idempotencyKey.d.ts.map +1 -0
- package/dist/transactions/settlement/idempotencyKey.js +10 -0
- package/dist/transactions/settlement/idempotencyKey.js.map +1 -0
- package/dist/transactions/settlement/pendingWrite.d.ts +113 -0
- package/dist/transactions/settlement/pendingWrite.d.ts.map +1 -0
- package/dist/transactions/settlement/pendingWrite.js +21 -0
- package/dist/transactions/settlement/pendingWrite.js.map +1 -0
- package/dist/transport/commitFrames.d.ts +91 -0
- package/dist/transport/commitFrames.d.ts.map +1 -0
- package/dist/transport/commitFrames.js +135 -0
- package/dist/transport/commitFrames.js.map +1 -0
- package/dist/transport/connectionManager.d.ts +216 -0
- package/dist/transport/connectionManager.d.ts.map +1 -0
- package/dist/transport/connectionManager.js +674 -0
- package/dist/transport/connectionManager.js.map +1 -0
- package/dist/transport/credentialLifecycle.d.ts +178 -0
- package/dist/transport/credentialLifecycle.d.ts.map +1 -0
- package/dist/transport/credentialLifecycle.js +324 -0
- package/dist/transport/credentialLifecycle.js.map +1 -0
- package/dist/transport/heartbeat.d.ts +66 -0
- package/dist/transport/heartbeat.d.ts.map +1 -0
- package/dist/transport/heartbeat.js +94 -0
- package/dist/transport/heartbeat.js.map +1 -0
- package/dist/transport/httpClient.d.ts +143 -0
- package/dist/transport/httpClient.d.ts.map +1 -0
- package/dist/transport/httpClient.js +150 -0
- package/dist/transport/httpClient.js.map +1 -0
- package/dist/transport/httpFeed.d.ts +4 -0
- package/dist/transport/httpFeed.d.ts.map +1 -0
- package/dist/transport/httpFeed.js +94 -0
- package/dist/transport/httpFeed.js.map +1 -0
- package/dist/transport/httpOptions.d.ts +34 -0
- package/dist/transport/httpOptions.d.ts.map +1 -0
- package/dist/transport/httpOptions.js +13 -0
- package/dist/transport/httpOptions.js.map +1 -0
- package/dist/transport/httpTransport.d.ts +68 -0
- package/dist/transport/httpTransport.d.ts.map +1 -0
- package/dist/transport/httpTransport.js +1433 -0
- package/dist/transport/httpTransport.js.map +1 -0
- package/dist/transport/networkProbe.d.ts +85 -0
- package/dist/transport/networkProbe.d.ts.map +1 -0
- package/dist/transport/networkProbe.js +208 -0
- package/dist/transport/networkProbe.js.map +1 -0
- package/dist/transport/wsFrameHandlers.d.ts +129 -0
- package/dist/transport/wsFrameHandlers.d.ts.map +1 -0
- package/dist/transport/wsFrameHandlers.js +429 -0
- package/dist/transport/wsFrameHandlers.js.map +1 -0
- package/dist/transport/wsTransport.d.ts +575 -0
- package/dist/transport/wsTransport.d.ts.map +1 -0
- package/dist/transport/wsTransport.js +1024 -0
- package/dist/transport/wsTransport.js.map +1 -0
- package/dist/types/assertExact.d.ts +18 -0
- package/dist/types/assertExact.d.ts.map +1 -0
- package/dist/types/assertExact.js +2 -0
- package/dist/types/assertExact.js.map +1 -0
- package/dist/types/global.d.ts +108 -0
- package/dist/types/global.d.ts.map +1 -0
- package/dist/types/global.js +41 -0
- package/dist/types/global.js.map +1 -0
- package/dist/types/index.d.ts +206 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +57 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/modelData.d.ts +11 -0
- package/dist/types/modelData.d.ts.map +1 -0
- package/dist/types/modelData.js +10 -0
- package/dist/types/modelData.js.map +1 -0
- package/dist/types/participant.d.ts +21 -0
- package/dist/types/participant.d.ts.map +1 -0
- package/dist/types/participant.js +11 -0
- package/dist/types/participant.js.map +1 -0
- package/dist/types/streams.d.ts +545 -0
- package/dist/types/streams.d.ts.map +1 -0
- package/dist/types/streams.js +12 -0
- package/dist/types/streams.js.map +1 -0
- package/dist/utils/asyncIterator.d.ts +35 -0
- package/dist/utils/asyncIterator.d.ts.map +1 -0
- package/dist/utils/asyncIterator.js +136 -0
- package/dist/utils/asyncIterator.js.map +1 -0
- package/dist/utils/duration.d.ts +51 -0
- package/dist/utils/duration.d.ts.map +1 -0
- package/dist/utils/duration.js +78 -0
- package/dist/utils/duration.js.map +1 -0
- package/dist/utils/json.d.ts +58 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +277 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/webhooks/events.d.ts +44 -0
- package/dist/webhooks/events.d.ts.map +1 -0
- package/dist/webhooks/events.js +43 -0
- package/dist/webhooks/events.js.map +1 -0
- package/dist/webhooks/index.d.ts +9 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +9 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/wire/accountResponses.d.ts +463 -0
- package/dist/wire/accountResponses.d.ts.map +1 -0
- package/dist/wire/accountResponses.js +294 -0
- package/dist/wire/accountResponses.js.map +1 -0
- package/dist/wire/auth.d.ts +57 -0
- package/dist/wire/auth.d.ts.map +1 -0
- package/dist/wire/auth.js +71 -0
- package/dist/wire/auth.js.map +1 -0
- package/dist/wire/bootstrapReason.d.ts +10 -0
- package/dist/wire/bootstrapReason.d.ts.map +1 -0
- package/dist/wire/bootstrapReason.js +9 -0
- package/dist/wire/bootstrapReason.js.map +1 -0
- package/dist/wire/claimEvent.d.ts +70 -0
- package/dist/wire/claimEvent.d.ts.map +1 -0
- package/dist/wire/claimEvent.js +74 -0
- package/dist/wire/claimEvent.js.map +1 -0
- package/dist/wire/claims.d.ts +475 -0
- package/dist/wire/claims.d.ts.map +1 -0
- package/dist/wire/claims.js +326 -0
- package/dist/wire/claims.js.map +1 -0
- package/dist/wire/commit.d.ts +604 -0
- package/dist/wire/commit.d.ts.map +1 -0
- package/dist/wire/commit.js +322 -0
- package/dist/wire/commit.js.map +1 -0
- package/dist/wire/delta.d.ts +251 -0
- package/dist/wire/delta.d.ts.map +1 -0
- package/dist/wire/delta.js +148 -0
- package/dist/wire/delta.js.map +1 -0
- package/dist/wire/errorEnvelope.d.ts +73 -0
- package/dist/wire/errorEnvelope.d.ts.map +1 -0
- package/dist/wire/errorEnvelope.js +124 -0
- package/dist/wire/errorEnvelope.js.map +1 -0
- package/dist/wire/feedCursor.d.ts +61 -0
- package/dist/wire/feedCursor.d.ts.map +1 -0
- package/dist/wire/feedCursor.js +83 -0
- package/dist/wire/feedCursor.js.map +1 -0
- package/dist/wire/feedEvent.d.ts +264 -0
- package/dist/wire/feedEvent.d.ts.map +1 -0
- package/dist/wire/feedEvent.js +66 -0
- package/dist/wire/feedEvent.js.map +1 -0
- package/dist/wire/frames.d.ts +195 -0
- package/dist/wire/frames.d.ts.map +1 -0
- package/dist/wire/frames.js +51 -0
- package/dist/wire/frames.js.map +1 -0
- package/dist/wire/inboundFrames.d.ts +490 -0
- package/dist/wire/inboundFrames.d.ts.map +1 -0
- package/dist/wire/inboundFrames.js +117 -0
- package/dist/wire/inboundFrames.js.map +1 -0
- package/dist/wire/index.d.ts +55 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +84 -0
- package/dist/wire/index.js.map +1 -0
- package/dist/wire/listEnvelope.d.ts +38 -0
- package/dist/wire/listEnvelope.d.ts.map +1 -0
- package/dist/wire/listEnvelope.js +43 -0
- package/dist/wire/listEnvelope.js.map +1 -0
- package/dist/wire/modelMutations.d.ts +32 -0
- package/dist/wire/modelMutations.d.ts.map +1 -0
- package/dist/wire/modelMutations.js +53 -0
- package/dist/wire/modelMutations.js.map +1 -0
- package/dist/wire/modelResponses.d.ts +79 -0
- package/dist/wire/modelResponses.d.ts.map +1 -0
- package/dist/wire/modelResponses.js +44 -0
- package/dist/wire/modelResponses.js.map +1 -0
- package/dist/wire/modelShape.d.ts +79 -0
- package/dist/wire/modelShape.d.ts.map +1 -0
- package/dist/wire/modelShape.js +75 -0
- package/dist/wire/modelShape.js.map +1 -0
- package/dist/wire/protocol.d.ts +39 -0
- package/dist/wire/protocol.d.ts.map +1 -0
- package/dist/wire/protocol.js +39 -0
- package/dist/wire/protocol.js.map +1 -0
- package/dist/wire/protocolVersion.d.ts +74 -0
- package/dist/wire/protocolVersion.d.ts.map +1 -0
- package/dist/wire/protocolVersion.js +84 -0
- package/dist/wire/protocolVersion.js.map +1 -0
- package/package.json +187 -0
- package/src/ablo.ts +139 -0
- package/src/ai-sdk/coordinatedTool.ts +214 -0
- package/src/ai-sdk/index.ts +7 -0
- package/src/auth/apiKey.ts +540 -0
- package/src/auth/bootstrapScope.ts +15 -0
- package/src/auth/browserCredentialSafety.ts +48 -0
- package/src/auth/capability.ts +326 -0
- package/src/auth/capabilityLifecycle.ts +174 -0
- package/src/auth/credentialEndpoint.ts +79 -0
- package/src/auth/credentialEndpointProtocol.ts +51 -0
- package/src/auth/credentialKind.ts +20 -0
- package/src/auth/credentialPolicy.ts +244 -0
- package/src/auth/credentialResult.ts +23 -0
- package/src/auth/credentialSource.ts +99 -0
- package/src/auth/hostedEndpoints.ts +24 -0
- package/src/auth/identity.ts +330 -0
- package/src/auth/index.ts +592 -0
- package/src/auth/schemas.ts +94 -0
- package/src/auth/sessionMint.ts +126 -0
- package/src/auth/token.ts +4 -0
- package/src/batching/index.ts +200 -0
- package/src/coordination/awaitClaimGrant.ts +243 -0
- package/src/coordination/claimHeartbeatLoop.ts +165 -0
- package/src/coordination/claimMeta.ts +56 -0
- package/src/coordination/events.ts +86 -0
- package/src/coordination/index.ts +181 -0
- package/src/coordination/locator.ts +200 -0
- package/src/coordination/schema.ts +1346 -0
- package/src/coordination/targetConflict.ts +85 -0
- package/src/coordination/trace.ts +173 -0
- package/src/docs/catalog.ts +274 -0
- package/src/docs/index.ts +18 -0
- package/src/durableWrites.ts +134 -0
- package/src/environment.ts +132 -0
- package/src/errorCodes.ts +1591 -0
- package/src/errors.ts +918 -0
- package/src/footprint.ts +0 -0
- package/src/headlessClient.ts +161 -0
- package/src/index.ts +52 -0
- package/src/keys/index.ts +254 -0
- package/src/log/syncDeltaRow.ts +119 -0
- package/src/logger.ts +22 -0
- package/src/observability.ts +85 -0
- package/src/policy/types.ts +292 -0
- package/src/resources/functionalUpdate.ts +151 -0
- package/src/resources/httpResources.ts +520 -0
- package/src/resources/modelOperations.ts +444 -0
- package/src/resources/mutationOptions.ts +66 -0
- package/src/resources/where.ts +160 -0
- package/src/resources/writeOptionsSchema.ts +91 -0
- package/src/schema/coordination.ts +161 -0
- package/src/schema/ddl.ts +593 -0
- package/src/schema/ddlLock.ts +53 -0
- package/src/schema/diff.ts +489 -0
- package/src/schema/field.ts +321 -0
- package/src/schema/fieldRef.ts +88 -0
- package/src/schema/generate.ts +95 -0
- package/src/schema/index.ts +278 -0
- package/src/schema/loadStrategy.ts +52 -0
- package/src/schema/model.ts +476 -0
- package/src/schema/openapi.ts +658 -0
- package/src/schema/queries.ts +273 -0
- package/src/schema/relation.ts +291 -0
- package/src/schema/residency.ts +30 -0
- package/src/schema/roles.ts +325 -0
- package/src/schema/schema.ts +825 -0
- package/src/schema/select.ts +115 -0
- package/src/schema/serialize.ts +373 -0
- package/src/schema/sugar.ts +194 -0
- package/src/schema/tenancy.ts +221 -0
- package/src/server/adapter.ts +203 -0
- package/src/server/commit.ts +109 -0
- package/src/server/index.ts +26 -0
- package/src/server/readConfig.ts +82 -0
- package/src/server/storageMode.ts +20 -0
- package/src/source/adapter.ts +85 -0
- package/src/source/adapters/drizzle.ts +291 -0
- package/src/source/adapters/kysely.ts +346 -0
- package/src/source/adapters/kyselyMutationCore.ts +220 -0
- package/src/source/adapters/memory.ts +154 -0
- package/src/source/adapters/prisma.ts +282 -0
- package/src/source/conformance.ts +287 -0
- package/src/source/connector.ts +394 -0
- package/src/source/connectorProtocol.ts +189 -0
- package/src/source/contract.ts +221 -0
- package/src/source/drizzle.ts +1 -0
- package/src/source/factory.ts +444 -0
- package/src/source/idempotency.ts +189 -0
- package/src/source/index.ts +182 -0
- package/src/source/kysely.ts +2 -0
- package/src/source/migrations.ts +109 -0
- package/src/source/next.ts +38 -0
- package/src/source/pushQueue.ts +368 -0
- package/src/source/signing.ts +279 -0
- package/src/source/types.ts +502 -0
- package/src/syncLog/contract.ts +32 -0
- package/src/syncLog/index.ts +1 -0
- package/src/testing/fixtures/httpResponses.ts +155 -0
- package/src/transactionLayer.ts +122 -0
- package/src/transactions/settlement/commitEnvelope.ts +192 -0
- package/src/transactions/settlement/httpCommitEnvelope.ts +250 -0
- package/src/transactions/settlement/idempotencyKey.ts +11 -0
- package/src/transactions/settlement/pendingWrite.ts +24 -0
- package/src/transport/commitFrames.ts +225 -0
- package/src/transport/connectionManager.ts +856 -0
- package/src/transport/credentialLifecycle.ts +389 -0
- package/src/transport/heartbeat.ts +118 -0
- package/src/transport/httpClient.ts +354 -0
- package/src/transport/httpFeed.ts +111 -0
- package/src/transport/httpOptions.ts +41 -0
- package/src/transport/httpTransport.ts +1976 -0
- package/src/transport/networkProbe.ts +249 -0
- package/src/transport/wsFrameHandlers.ts +619 -0
- package/src/transport/wsTransport.ts +1491 -0
- package/src/types/assertExact.ts +17 -0
- package/src/types/global.ts +123 -0
- package/src/types/index.ts +270 -0
- package/src/types/modelData.ts +11 -0
- package/src/types/participant.ts +22 -0
- package/src/types/streams.ts +702 -0
- package/src/utils/asyncIterator.ts +141 -0
- package/src/utils/duration.ts +88 -0
- package/src/utils/json.ts +281 -0
- package/src/webhooks/events.ts +96 -0
- package/src/webhooks/index.ts +12 -0
- package/src/wire/accountResponses.ts +328 -0
- package/src/wire/auth.ts +86 -0
- package/src/wire/bootstrapReason.ts +10 -0
- package/src/wire/claimEvent.ts +85 -0
- package/src/wire/claims.ts +370 -0
- package/src/wire/commit.ts +379 -0
- package/src/wire/delta.ts +173 -0
- package/src/wire/errorEnvelope.ts +133 -0
- package/src/wire/feedCursor.ts +91 -0
- package/src/wire/feedEvent.ts +74 -0
- package/src/wire/frames.ts +77 -0
- package/src/wire/inboundFrames.ts +182 -0
- package/src/wire/index.ts +328 -0
- package/src/wire/listEnvelope.ts +51 -0
- package/src/wire/modelMutations.ts +55 -0
- package/src/wire/modelResponses.ts +48 -0
- package/src/wire/modelShape.ts +83 -0
- package/src/wire/protocol.ts +39 -0
- package/src/wire/protocolVersion.ts +97 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mints a session token. This is the single implementation behind
|
|
3
|
+
* `sessions.create`, shared by the WebSocket and HTTP clients so the two never
|
|
4
|
+
* disagree on how a token is produced.
|
|
5
|
+
*
|
|
6
|
+
* Minting is a plain control-plane HTTP call — no socket, no synced data. A
|
|
7
|
+
* backend holding a secret key (`sk_`) exchanges it for a short-lived, scoped
|
|
8
|
+
* token whose kind depends on the session requested:
|
|
9
|
+
*
|
|
10
|
+
* `{ user }` → POST /v1/ephemeral_keys, returning an `ek_` key carrying the
|
|
11
|
+
* explicit grant in `can`. This is the only route that mints a
|
|
12
|
+
* user session; the capability route rejects a `user`
|
|
13
|
+
* participant with `invalid_participant_kind`.
|
|
14
|
+
* `{ agent }` → POST /v1/capabilities, returning an `rk_` key scoped to exactly
|
|
15
|
+
* the operations named in `can`. For example
|
|
16
|
+
* `can: { tasks: ['update'] }` becomes the wire allowlist entry
|
|
17
|
+
* `tasks.update`, which the server matches against the model's
|
|
18
|
+
* registered names.
|
|
19
|
+
*
|
|
20
|
+
* The caller supplies the already-resolved secret key and base URL in
|
|
21
|
+
* {@link MintSessionContext}. Choosing which key to pass — the original secret
|
|
22
|
+
* key, not a derived key that an earlier exchange may have produced — is the
|
|
23
|
+
* caller's responsibility.
|
|
24
|
+
*/
|
|
25
|
+
import {
|
|
26
|
+
exchangeApiKey,
|
|
27
|
+
mintUserSessionKey,
|
|
28
|
+
} from '../auth/index.js';
|
|
29
|
+
import {
|
|
30
|
+
capabilityCanSchemaFor,
|
|
31
|
+
grantedOperations,
|
|
32
|
+
} from './capability.js';
|
|
33
|
+
import type { SchemaRecord } from '../schema/schema.js';
|
|
34
|
+
import type { AbloSession, CreateSessionParams } from '../resources/httpResources.js';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The resolved control-plane details a mint needs: a secret key, a base URL,
|
|
38
|
+
* and an optional `fetch`. When `fetch` is omitted, the auth helpers fall back
|
|
39
|
+
* to the runtime's global `fetch`.
|
|
40
|
+
*/
|
|
41
|
+
export interface MintSessionContext {
|
|
42
|
+
readonly apiKey: string;
|
|
43
|
+
readonly baseUrl: string;
|
|
44
|
+
readonly fetch?: typeof fetch;
|
|
45
|
+
/**
|
|
46
|
+
* Each schema key mapped to its wire type name, from
|
|
47
|
+
* {@link modelWireNames} over the client's own schema. Required, and derived
|
|
48
|
+
* rather than assembled: `can` is keyed by schema key while a capability is
|
|
49
|
+
* scoped by the type name the server checks, so
|
|
50
|
+
* `can: { documents: ['update'] }` on a model whose type name is overridden
|
|
51
|
+
* to `Document` must mint `document.update`. A caller who leaves this out
|
|
52
|
+
* mints a grant the server denies on the first write.
|
|
53
|
+
*/
|
|
54
|
+
readonly modelTypenames: Readonly<Record<string, string>>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Mints a session token from an already-resolved secret key and base URL.
|
|
59
|
+
* Routes the `{ user }` or `{ agent }` request to the matching mint endpoint
|
|
60
|
+
* and reshapes the response into an {@link AbloSession}.
|
|
61
|
+
*/
|
|
62
|
+
export async function mintSession<S extends SchemaRecord>(
|
|
63
|
+
params: CreateSessionParams<S>,
|
|
64
|
+
ctx: MintSessionContext,
|
|
65
|
+
): Promise<AbloSession> {
|
|
66
|
+
const { apiKey, baseUrl } = ctx;
|
|
67
|
+
// Static typing and runtime validation consume the same schema-bound grant
|
|
68
|
+
// contract. This catches JavaScript callers, decoded JSON, and unsafe casts
|
|
69
|
+
// before a credential reaches either mint endpoint.
|
|
70
|
+
const can = capabilityCanSchemaFor(ctx.modelTypenames).parse(params.can);
|
|
71
|
+
|
|
72
|
+
if (params.user) {
|
|
73
|
+
const operations = grantedOperations(can, ctx.modelTypenames);
|
|
74
|
+
const res = await mintUserSessionKey({
|
|
75
|
+
apiKey,
|
|
76
|
+
baseUrl,
|
|
77
|
+
userId: params.user.id,
|
|
78
|
+
...(params.organizationId ? { organizationId: params.organizationId } : {}),
|
|
79
|
+
...(params.syncGroups ? { syncGroups: [...params.syncGroups] } : {}),
|
|
80
|
+
operations,
|
|
81
|
+
ttlSeconds: params.ttlSeconds ?? 900,
|
|
82
|
+
...(ctx.fetch ? { fetch: ctx.fetch } : {}),
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
object: 'session',
|
|
86
|
+
id: res.id,
|
|
87
|
+
token: res.token,
|
|
88
|
+
expiresAt: res.expiresAt,
|
|
89
|
+
organizationId: res.organizationId,
|
|
90
|
+
// The ephemeral mint stores scope on the key row; reshape its flat
|
|
91
|
+
// response into the session resource's scope block.
|
|
92
|
+
scope: {
|
|
93
|
+
organizationId: res.organizationId,
|
|
94
|
+
syncGroups: res.syncGroups,
|
|
95
|
+
operations: res.operations,
|
|
96
|
+
participantKind: 'user',
|
|
97
|
+
participantId: res.participantId,
|
|
98
|
+
},
|
|
99
|
+
userMeta: params.userMeta ?? { id: res.participantId },
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// One translation from the declared grant to the wire allowlist, shared with
|
|
104
|
+
// every other door that mints — see `auth/capability.ts`.
|
|
105
|
+
const operations = grantedOperations(can, ctx.modelTypenames);
|
|
106
|
+
const res = await exchangeApiKey({
|
|
107
|
+
apiKey,
|
|
108
|
+
baseUrl,
|
|
109
|
+
participantKind: 'agent',
|
|
110
|
+
participantId: params.agent.id,
|
|
111
|
+
...(params.syncGroups ? { syncGroups: [...params.syncGroups] } : {}),
|
|
112
|
+
operations,
|
|
113
|
+
ttlSeconds: params.ttlSeconds ?? 900,
|
|
114
|
+
...(params.userMeta ? { userMeta: params.userMeta } : {}),
|
|
115
|
+
...(ctx.fetch ? { fetch: ctx.fetch } : {}),
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
object: 'session',
|
|
119
|
+
id: res.capabilityId,
|
|
120
|
+
token: res.token,
|
|
121
|
+
expiresAt: res.expiresAt,
|
|
122
|
+
organizationId: res.organizationId,
|
|
123
|
+
scope: res.scope,
|
|
124
|
+
userMeta: res.userMeta,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small, dependency-free primitive that coalesces work into batches.
|
|
3
|
+
*
|
|
4
|
+
* It accumulates items enqueued close together — the common case being a
|
|
5
|
+
* synchronous burst such as `Promise.all([ a(), b(), c() ])` within one
|
|
6
|
+
* event-loop tick — and dispatches them as a single batch rather than one call
|
|
7
|
+
* each. It is a pure state machine: it stages items on the microtask queue,
|
|
8
|
+
* flushes on size, cost, or time triggers, and applies in-flight backpressure,
|
|
9
|
+
* with no dependency on any data model, storage layer, or network. You supply
|
|
10
|
+
* the dispatch function through {@link BatchSchedulerHooks}.
|
|
11
|
+
*
|
|
12
|
+
* Guarantees:
|
|
13
|
+
* - each batch is a single `dispatchBatch(items)` call, applied atomically.
|
|
14
|
+
* - if a dispatch fails, every enqueued promise in that batch rejects with
|
|
15
|
+
* the same error.
|
|
16
|
+
* - items dispatch in enqueue order, optionally reordered by `compare` just
|
|
17
|
+
* before a batch is cut; batches run first-in, first-out under a
|
|
18
|
+
* `maxInFlight` cap.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export interface BatchSchedulerOptions<T> {
|
|
22
|
+
/** Master switch. When false, every `enqueue` dispatches solo immediately. Default true. */
|
|
23
|
+
readonly enabled?: boolean;
|
|
24
|
+
/** Coalescing window in ms. `0` (default) → flush on the next microtask (zero added latency). */
|
|
25
|
+
readonly windowMs?: number;
|
|
26
|
+
/** Max items per batch before a forced flush. Default 256. */
|
|
27
|
+
readonly maxBatchSize?: number;
|
|
28
|
+
/** Max accumulated `costOf` per batch before a forced flush. Default `Infinity` (disabled). */
|
|
29
|
+
readonly maxBatchCost?: number;
|
|
30
|
+
/** Per-item cost used by `maxBatchCost` (e.g. serialized bytes). Default `() => 0`. */
|
|
31
|
+
readonly costOf?: (item: T) => number;
|
|
32
|
+
/** Max dispatches in flight at once (backpressure). Default 1 → strictly ordered. */
|
|
33
|
+
readonly maxInFlight?: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface BatchSchedulerHooks<T, R> {
|
|
37
|
+
/** The single dispatch for one batch. One call → atomic at this layer. */
|
|
38
|
+
dispatchBatch(items: T[]): Promise<R>;
|
|
39
|
+
/**
|
|
40
|
+
* Optional ordering applied to the staged items just before a batch is cut —
|
|
41
|
+
* for example, to send parent rows ahead of the rows that reference them. Omit
|
|
42
|
+
* for first-in, first-out order. This changes only the order of items within
|
|
43
|
+
* the dispatched array, not which items share a batch.
|
|
44
|
+
*/
|
|
45
|
+
compare?(a: T, b: T): number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface BatchScheduler<T, R> {
|
|
49
|
+
/** Stage one item; resolves with its batch's dispatch result, or rejects with the batch error. */
|
|
50
|
+
enqueue(item: T): Promise<R>;
|
|
51
|
+
/** Stage an item that must dispatch in a batch of its own — for example, one carrying an explicit idempotency key. */
|
|
52
|
+
enqueueSolo(item: T): Promise<R>;
|
|
53
|
+
/** Force-flush the pending batch and resolve once everything in flight has settled. */
|
|
54
|
+
flush(): Promise<void>;
|
|
55
|
+
/** Stop scheduling and clear timers. Pending/in-flight promises still settle. */
|
|
56
|
+
dispose(): void;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
interface Deferred<R> {
|
|
60
|
+
resolve(result: R): void;
|
|
61
|
+
reject(error: unknown): void;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface Batch<T, R> {
|
|
65
|
+
items: T[];
|
|
66
|
+
deferreds: Deferred<R>[];
|
|
67
|
+
cost: number;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function createBatchScheduler<T, R>(
|
|
71
|
+
hooks: BatchSchedulerHooks<T, R>,
|
|
72
|
+
options?: BatchSchedulerOptions<T>,
|
|
73
|
+
): BatchScheduler<T, R> {
|
|
74
|
+
const enabled = options?.enabled ?? true;
|
|
75
|
+
const windowMs = options?.windowMs ?? 0;
|
|
76
|
+
const maxBatchSize = options?.maxBatchSize ?? 256;
|
|
77
|
+
const maxBatchCost = options?.maxBatchCost ?? Infinity;
|
|
78
|
+
const costOf = options?.costOf ?? (() => 0);
|
|
79
|
+
const maxInFlight = options?.maxInFlight ?? 1;
|
|
80
|
+
|
|
81
|
+
let pending: Batch<T, R> | null = null;
|
|
82
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
83
|
+
let microtaskScheduled = false;
|
|
84
|
+
const ready: Batch<T, R>[] = [];
|
|
85
|
+
let inFlight = 0;
|
|
86
|
+
let idleWaiters: (() => void)[] = [];
|
|
87
|
+
let disposed = false;
|
|
88
|
+
|
|
89
|
+
function scheduleFlush(): void {
|
|
90
|
+
if (microtaskScheduled || timer) return;
|
|
91
|
+
if (windowMs > 0) {
|
|
92
|
+
timer = setTimeout(() => {
|
|
93
|
+
timer = null;
|
|
94
|
+
flushPending();
|
|
95
|
+
}, windowMs);
|
|
96
|
+
} else {
|
|
97
|
+
microtaskScheduled = true;
|
|
98
|
+
queueMicrotask(() => {
|
|
99
|
+
microtaskScheduled = false;
|
|
100
|
+
flushPending();
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function flushPending(): void {
|
|
106
|
+
if (timer) {
|
|
107
|
+
clearTimeout(timer);
|
|
108
|
+
timer = null;
|
|
109
|
+
}
|
|
110
|
+
microtaskScheduled = false;
|
|
111
|
+
if (!pending) return;
|
|
112
|
+
if (hooks.compare) pending.items.sort(hooks.compare);
|
|
113
|
+
ready.push(pending);
|
|
114
|
+
pending = null;
|
|
115
|
+
pump();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function pump(): void {
|
|
119
|
+
while (inFlight < maxInFlight && ready.length > 0) {
|
|
120
|
+
const batch = ready.shift();
|
|
121
|
+
if (!batch) break;
|
|
122
|
+
inFlight++;
|
|
123
|
+
let dispatched: Promise<R>;
|
|
124
|
+
try {
|
|
125
|
+
dispatched = hooks.dispatchBatch(batch.items);
|
|
126
|
+
} catch (error) {
|
|
127
|
+
dispatched = Promise.reject(error);
|
|
128
|
+
}
|
|
129
|
+
dispatched
|
|
130
|
+
.then(
|
|
131
|
+
(result) => {
|
|
132
|
+
for (const d of batch.deferreds) d.resolve(result);
|
|
133
|
+
},
|
|
134
|
+
(error: unknown) => {
|
|
135
|
+
for (const d of batch.deferreds) d.reject(error);
|
|
136
|
+
},
|
|
137
|
+
)
|
|
138
|
+
.finally(() => {
|
|
139
|
+
inFlight--;
|
|
140
|
+
pump();
|
|
141
|
+
notifyIdleIfDrained();
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function notifyIdleIfDrained(): void {
|
|
147
|
+
if (inFlight === 0 && ready.length === 0 && idleWaiters.length > 0) {
|
|
148
|
+
const waiters = idleWaiters;
|
|
149
|
+
idleWaiters = [];
|
|
150
|
+
for (const w of waiters) w();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function enqueueSolo(item: T): Promise<R> {
|
|
155
|
+
return new Promise<R>((resolve, reject) => {
|
|
156
|
+
ready.push({ items: [item], deferreds: [{ resolve, reject }], cost: costOf(item) });
|
|
157
|
+
pump();
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function enqueue(item: T): Promise<R> {
|
|
162
|
+
if (disposed) return Promise.reject(new Error('batch scheduler disposed'));
|
|
163
|
+
if (!enabled) return enqueueSolo(item);
|
|
164
|
+
const cost = costOf(item);
|
|
165
|
+
return new Promise<R>((resolve, reject) => {
|
|
166
|
+
const deferred: Deferred<R> = { resolve, reject };
|
|
167
|
+
// Rollover: if appending would blow a cap, flush the current batch first.
|
|
168
|
+
if (pending && (pending.items.length + 1 > maxBatchSize || pending.cost + cost > maxBatchCost)) {
|
|
169
|
+
flushPending();
|
|
170
|
+
}
|
|
171
|
+
if (!pending) pending = { items: [], deferreds: [], cost: 0 };
|
|
172
|
+
pending.items.push(item);
|
|
173
|
+
pending.deferreds.push(deferred);
|
|
174
|
+
pending.cost += cost;
|
|
175
|
+
if (pending.items.length >= maxBatchSize || pending.cost >= maxBatchCost) {
|
|
176
|
+
flushPending();
|
|
177
|
+
} else {
|
|
178
|
+
scheduleFlush();
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async function flush(): Promise<void> {
|
|
184
|
+
flushPending();
|
|
185
|
+
while (ready.length > 0 || inFlight > 0) {
|
|
186
|
+
await new Promise<void>((resolve) => idleWaiters.push(resolve));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function dispose(): void {
|
|
191
|
+
disposed = true;
|
|
192
|
+
if (timer) {
|
|
193
|
+
clearTimeout(timer);
|
|
194
|
+
timer = null;
|
|
195
|
+
}
|
|
196
|
+
microtaskScheduled = false;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return { enqueue, enqueueSolo, flush, dispose };
|
|
200
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waits for a queued claim to reach the head of the line — the client side of
|
|
3
|
+
* the fair-queue handover. When a claim is contended, the server puts it in a
|
|
4
|
+
* queue and replies that it is queued (HTTP 202 on `/v1/claims`, or a
|
|
5
|
+
* `claim_queued` frame over the WebSocket). The grant is delivered later, when
|
|
6
|
+
* the claim reaches the head, as a `claim_granted` frame. This resolves once
|
|
7
|
+
* that frame arrives for the given `claimId`, so the caller's `claim` promise
|
|
8
|
+
* stays pending — event-driven, with no polling — until it is actually the
|
|
9
|
+
* caller's turn. It rejects if the claim is lost (`claim_lost`: taken away by a
|
|
10
|
+
* TTL lapse on disconnect, or revoked) or if an optional timeout elapses.
|
|
11
|
+
*
|
|
12
|
+
* It needs only a minimal `{ subscribe }` transport, so it can be tested
|
|
13
|
+
* against a fake; the duplex `WsTransport` satisfies it.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import {
|
|
17
|
+
AbloClaimedError,
|
|
18
|
+
AbloValidationError,
|
|
19
|
+
CapabilityError,
|
|
20
|
+
formatClaimedErrorMessage,
|
|
21
|
+
claimTargetLabel,
|
|
22
|
+
} from '../errors.js';
|
|
23
|
+
import type { ClaimRejection } from './schema.js';
|
|
24
|
+
import { modelTarget } from './locator.js';
|
|
25
|
+
import { noopLogger, type Logger } from '../logger.js';
|
|
26
|
+
|
|
27
|
+
export interface GrantTransport {
|
|
28
|
+
subscribe(
|
|
29
|
+
event:
|
|
30
|
+
| 'claim_acquired'
|
|
31
|
+
| 'claim_granted'
|
|
32
|
+
| 'claim_lost'
|
|
33
|
+
| 'claim_queued'
|
|
34
|
+
| 'claim_rejected',
|
|
35
|
+
handler: (payload: Record<string, unknown>) => void,
|
|
36
|
+
): () => void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ClaimGrantInfo {
|
|
40
|
+
/**
|
|
41
|
+
* True when the grant arrived as `claim_granted` — the target was held when
|
|
42
|
+
* the caller asked, and the caller waited in the FIFO line behind the holder.
|
|
43
|
+
* False for the immediate `claim_acquired`, where the target was free.
|
|
44
|
+
*
|
|
45
|
+
* Callers read this to know the row may have changed while they queued. Claim
|
|
46
|
+
* visibility is scoped to the entity, so a broad, organization-wide
|
|
47
|
+
* subscription receives no presence or claim fan-out, and the local
|
|
48
|
+
* coordination snapshot cannot be trusted to tell whether the caller waited.
|
|
49
|
+
* The grant frame itself is the authoritative signal.
|
|
50
|
+
*/
|
|
51
|
+
readonly waited: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* The fencing token the server minted for this grant (Option B), read off the
|
|
54
|
+
* grant frame — the authoritative source, since the token is server-stamped.
|
|
55
|
+
* `undefined` when the server does not fence (no minter wired).
|
|
56
|
+
*/
|
|
57
|
+
readonly fenceToken?: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Read the server-stamped fencing token off a grant frame, if present. */
|
|
61
|
+
function readFenceToken(p: Record<string, unknown>): number | undefined {
|
|
62
|
+
return typeof p.fenceToken === 'number' ? p.fenceToken : undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function awaitClaimGrant(
|
|
66
|
+
transport: GrantTransport,
|
|
67
|
+
claimId: string,
|
|
68
|
+
options?: {
|
|
69
|
+
timeoutMs?: number;
|
|
70
|
+
/**
|
|
71
|
+
* Backpressure: reject instead of waiting if, when we join the line, the
|
|
72
|
+
* server reports `position >= maxQueueDepth` (i.e. that many claims are
|
|
73
|
+
* already ahead of us). Omit to wait however deep the queue is.
|
|
74
|
+
*/
|
|
75
|
+
maxQueueDepth?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Abort the wait from outside — the same signal that cancels everything
|
|
78
|
+
* else in the program. Rejects with `claim_wait_aborted`; once the grant
|
|
79
|
+
* has arrived the signal is ignored, so a held lease is never torn down
|
|
80
|
+
* by a late abort.
|
|
81
|
+
*/
|
|
82
|
+
signal?: AbortSignal;
|
|
83
|
+
/** Where grant transitions are logged. Defaults to silent. */
|
|
84
|
+
logger?: Logger;
|
|
85
|
+
},
|
|
86
|
+
): Promise<ClaimGrantInfo> {
|
|
87
|
+
const logger = options?.logger ?? noopLogger;
|
|
88
|
+
return new Promise<ClaimGrantInfo>((resolve, reject) => {
|
|
89
|
+
const unsubs: (() => void)[] = [];
|
|
90
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
91
|
+
const settle = (fn: () => void): void => {
|
|
92
|
+
if (timer) clearTimeout(timer);
|
|
93
|
+
for (const u of unsubs) u();
|
|
94
|
+
fn();
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// The target was free → `claim_acquired` (immediate); it was contended,
|
|
98
|
+
// we waited in line, and reached the head → `claim_granted`. Either frame
|
|
99
|
+
// means the lease is now ours; `waited` records which path it was.
|
|
100
|
+
unsubs.push(
|
|
101
|
+
transport.subscribe('claim_acquired', (p) => {
|
|
102
|
+
if (p?.claimId === claimId) {
|
|
103
|
+
logger.debug(`claim: acquired ${claimId} (target was free)`);
|
|
104
|
+
const fenceToken = readFenceToken(p);
|
|
105
|
+
settle(() => {
|
|
106
|
+
resolve({ waited: false, ...(fenceToken !== undefined ? { fenceToken } : {}) });
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}),
|
|
110
|
+
);
|
|
111
|
+
unsubs.push(
|
|
112
|
+
transport.subscribe('claim_granted', (p) => {
|
|
113
|
+
if (p?.claimId === claimId) {
|
|
114
|
+
// Promoted to the head of the line — the creator's "it's the agent's
|
|
115
|
+
// turn now" moment after waiting behind a holder.
|
|
116
|
+
logger.info(`claim: granted ${claimId} — your turn (waited in queue)`);
|
|
117
|
+
const fenceToken = readFenceToken(p);
|
|
118
|
+
settle(() => {
|
|
119
|
+
resolve({ waited: true, ...(fenceToken !== undefined ? { fenceToken } : {}) });
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}),
|
|
123
|
+
);
|
|
124
|
+
if (options?.maxQueueDepth !== undefined) {
|
|
125
|
+
const max = options.maxQueueDepth;
|
|
126
|
+
unsubs.push(
|
|
127
|
+
transport.subscribe('claim_queued', (p) => {
|
|
128
|
+
if (p?.claimId !== claimId) return;
|
|
129
|
+
const position = typeof p.position === 'number' ? p.position : 0;
|
|
130
|
+
if (position >= max) {
|
|
131
|
+
settle(() =>
|
|
132
|
+
{ reject(
|
|
133
|
+
new AbloClaimedError(
|
|
134
|
+
`Claim queue for ${claimId} is ${position} deep (max ${max}).`,
|
|
135
|
+
{ code: 'queue_too_deep' },
|
|
136
|
+
),
|
|
137
|
+
); },
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
}),
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
unsubs.push(
|
|
144
|
+
transport.subscribe('claim_rejected', (p) => {
|
|
145
|
+
const rejection = p as ClaimRejection;
|
|
146
|
+
if (rejection.claimId !== claimId) return;
|
|
147
|
+
const target = rejection.target
|
|
148
|
+
? claimTargetLabel({
|
|
149
|
+
...modelTarget(rejection.target),
|
|
150
|
+
field: rejection.target.field,
|
|
151
|
+
})
|
|
152
|
+
: claimId;
|
|
153
|
+
if (rejection.reason === 'capability_denied') {
|
|
154
|
+
settle(() => {
|
|
155
|
+
reject(
|
|
156
|
+
new CapabilityError(
|
|
157
|
+
'capability_scope_denied',
|
|
158
|
+
rejection.policyReason ??
|
|
159
|
+
`This credential may not claim ${target}.`,
|
|
160
|
+
),
|
|
161
|
+
);
|
|
162
|
+
});
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (rejection.reason === 'invalid_target') {
|
|
166
|
+
settle(() => {
|
|
167
|
+
reject(
|
|
168
|
+
new AbloValidationError(
|
|
169
|
+
rejection.policyReason ?? `Invalid claim target ${target}.`,
|
|
170
|
+
{ code: 'invalid_body' },
|
|
171
|
+
),
|
|
172
|
+
);
|
|
173
|
+
});
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
settle(() =>
|
|
177
|
+
{ reject(
|
|
178
|
+
new AbloClaimedError(
|
|
179
|
+
formatClaimedErrorMessage({
|
|
180
|
+
targetLabel: target,
|
|
181
|
+
heldBy: rejection.heldBy,
|
|
182
|
+
claim: rejection.heldByClaim,
|
|
183
|
+
policyReason: rejection.policyReason,
|
|
184
|
+
fallback: `Claim rejected for ${target}.`,
|
|
185
|
+
}),
|
|
186
|
+
{
|
|
187
|
+
code: rejection.reason === 'conflict'
|
|
188
|
+
? 'claim_conflict'
|
|
189
|
+
: 'claim_lease_unavailable',
|
|
190
|
+
claims: rejection.heldByClaim ? [rejection.heldByClaim] : undefined,
|
|
191
|
+
},
|
|
192
|
+
),
|
|
193
|
+
); },
|
|
194
|
+
);
|
|
195
|
+
}),
|
|
196
|
+
);
|
|
197
|
+
unsubs.push(
|
|
198
|
+
transport.subscribe('claim_lost', (p) => {
|
|
199
|
+
if (p?.claimId === claimId) {
|
|
200
|
+
settle(() =>
|
|
201
|
+
{ reject(
|
|
202
|
+
new AbloClaimedError(`Claim lost while queued for ${claimId}.`, {
|
|
203
|
+
code: 'claim_lost',
|
|
204
|
+
}),
|
|
205
|
+
); },
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
}),
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
if (options?.signal) {
|
|
212
|
+
const signal = options.signal;
|
|
213
|
+
const abort = (): void =>
|
|
214
|
+
settle(() => {
|
|
215
|
+
reject(
|
|
216
|
+
new AbloClaimedError(
|
|
217
|
+
`The wait for claim ${claimId} was aborted before the grant arrived.`,
|
|
218
|
+
{ code: 'claim_wait_aborted' },
|
|
219
|
+
),
|
|
220
|
+
);
|
|
221
|
+
});
|
|
222
|
+
if (signal.aborted) {
|
|
223
|
+
abort();
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
227
|
+
unsubs.push(() => { signal.removeEventListener('abort', abort); });
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (options?.timeoutMs && options.timeoutMs > 0) {
|
|
231
|
+
timer = setTimeout(() => {
|
|
232
|
+
settle(() =>
|
|
233
|
+
{ reject(
|
|
234
|
+
new AbloClaimedError(
|
|
235
|
+
`Timed out waiting for the queue grant on claim ${claimId}.`,
|
|
236
|
+
{ code: 'grant_timeout' },
|
|
237
|
+
),
|
|
238
|
+
); },
|
|
239
|
+
);
|
|
240
|
+
}, options.timeoutMs);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|