@abloatai/transaction 0.56.0 → 0.58.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 +54 -10
- package/README.md +3 -1
- package/dist/ai-sdk/modelTools.d.ts +3 -3
- package/dist/ai-sdk/modelTools.d.ts.map +1 -1
- package/dist/ai-sdk/modelTools.js +1 -1
- package/dist/ai-sdk/modelTools.js.map +1 -1
- package/dist/ai-sdk/updateTool.d.ts +5 -7
- package/dist/ai-sdk/updateTool.d.ts.map +1 -1
- package/dist/ai-sdk/updateTool.js +3 -5
- package/dist/ai-sdk/updateTool.js.map +1 -1
- package/dist/auth/capability.d.ts +5 -0
- package/dist/auth/capability.d.ts.map +1 -1
- package/dist/auth/capability.js +5 -0
- package/dist/auth/capability.js.map +1 -1
- package/dist/auth/capabilityLifecycle.d.ts +1 -1
- package/dist/auth/capabilityLifecycle.d.ts.map +1 -1
- package/dist/auth/credentialPolicy.d.ts +1 -1
- package/dist/auth/credentialPolicy.d.ts.map +1 -1
- package/dist/auth/identity.d.ts +3 -3
- package/dist/auth/identity.d.ts.map +1 -1
- package/dist/auth/identity.js +5 -5
- package/dist/auth/identity.js.map +1 -1
- package/dist/auth/index.d.ts +4 -208
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +4 -330
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts +218 -0
- package/dist/auth/runtime.d.ts.map +1 -0
- package/dist/auth/runtime.js +336 -0
- package/dist/auth/runtime.js.map +1 -0
- package/dist/auth/sessionMint.d.ts +1 -1
- package/dist/auth/sessionMint.d.ts.map +1 -1
- package/dist/auth/sessionMint.js +2 -1
- package/dist/auth/sessionMint.js.map +1 -1
- package/dist/branches.d.ts +25 -21
- package/dist/branches.d.ts.map +1 -1
- package/dist/branches.js +3 -0
- package/dist/branches.js.map +1 -1
- package/dist/{coordination/awaitClaimGrant.d.ts → claims/awaitGrant.d.ts} +1 -1
- package/dist/claims/awaitGrant.d.ts.map +1 -0
- package/dist/{coordination/awaitClaimGrant.js → claims/awaitGrant.js} +4 -4
- package/dist/claims/awaitGrant.js.map +1 -0
- package/dist/{wire/claims.d.ts → claims/contract.d.ts} +1 -1
- package/dist/claims/contract.d.ts.map +1 -0
- package/dist/{wire/claims.js → claims/contract.js} +2 -2
- package/dist/claims/contract.js.map +1 -0
- package/dist/{wire/claimEvent.d.ts → claims/eventContract.d.ts} +1 -1
- package/dist/claims/eventContract.d.ts.map +1 -0
- package/dist/{wire/claimEvent.js → claims/eventContract.js} +1 -1
- package/dist/claims/eventContract.js.map +1 -0
- package/dist/{coordination → claims}/events.d.ts +7 -11
- package/dist/claims/events.d.ts.map +1 -0
- package/dist/claims/events.js +8 -0
- package/dist/claims/events.js.map +1 -0
- package/dist/{coordination/claimHeartbeatLoop.d.ts → claims/heartbeat.d.ts} +1 -1
- package/dist/claims/heartbeat.d.ts.map +1 -0
- package/dist/{coordination/claimHeartbeatLoop.js → claims/heartbeat.js} +1 -1
- package/dist/claims/heartbeat.js.map +1 -0
- package/dist/claims/index.d.ts +17 -0
- package/dist/claims/index.d.ts.map +1 -0
- package/dist/claims/index.js +16 -0
- package/dist/claims/index.js.map +1 -0
- package/dist/claims/lifetime.d.ts +26 -0
- package/dist/claims/lifetime.d.ts.map +1 -0
- package/dist/claims/lifetime.js +62 -0
- package/dist/claims/lifetime.js.map +1 -0
- package/dist/{coordination → claims}/locator.d.ts +1 -1
- package/dist/claims/locator.d.ts.map +1 -0
- package/dist/{coordination → claims}/locator.js +2 -2
- package/dist/claims/locator.js.map +1 -0
- package/dist/{coordination/claimMeta.d.ts → claims/meta.d.ts} +1 -1
- package/dist/claims/meta.d.ts.map +1 -0
- package/dist/{coordination/claimMeta.js → claims/meta.js} +1 -1
- package/dist/claims/meta.js.map +1 -0
- package/dist/claims/routes.d.ts +59 -0
- package/dist/claims/routes.d.ts.map +1 -0
- package/dist/claims/routes.js +69 -0
- package/dist/claims/routes.js.map +1 -0
- package/dist/claims/targetConflict.d.ts.map +1 -0
- package/dist/claims/targetConflict.js.map +1 -0
- package/dist/{coordination → claims}/trace.d.ts +2 -2
- package/dist/claims/trace.d.ts.map +1 -0
- package/dist/{coordination → claims}/trace.js +5 -5
- package/dist/claims/trace.js.map +1 -0
- package/dist/{ablo.d.ts → client/ablo.d.ts} +6 -15
- package/dist/client/ablo.d.ts.map +1 -0
- package/dist/{ablo.js → client/ablo.js} +2 -2
- package/dist/client/ablo.js.map +1 -0
- package/dist/{transactionLayer.d.ts → client/contract.d.ts} +12 -14
- package/dist/client/contract.d.ts.map +1 -0
- package/dist/{transactionLayer.js → client/contract.js} +4 -5
- package/dist/client/contract.js.map +1 -0
- package/dist/{headlessClient.d.ts → client/headless.d.ts} +4 -4
- package/dist/client/headless.d.ts.map +1 -0
- package/dist/{headlessClient.js → client/headless.js} +8 -10
- package/dist/{headlessClient.js.map → client/headless.js.map} +1 -1
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +11 -0
- package/dist/client/index.js.map +1 -0
- package/dist/{resources → client/resources}/functionalUpdate.d.ts +4 -4
- package/dist/client/resources/functionalUpdate.d.ts.map +1 -0
- package/dist/{resources → client/resources}/functionalUpdate.js +3 -3
- package/dist/client/resources/functionalUpdate.js.map +1 -0
- package/dist/{resources → client/resources}/httpResources.d.ts +92 -77
- package/dist/client/resources/httpResources.d.ts.map +1 -0
- package/dist/client/resources/httpResources.js +94 -0
- package/dist/client/resources/httpResources.js.map +1 -0
- package/dist/client/resources/modelCreate.d.ts +21 -0
- package/dist/client/resources/modelCreate.d.ts.map +1 -0
- package/dist/client/resources/modelCreate.js +49 -0
- package/dist/client/resources/modelCreate.js.map +1 -0
- package/dist/{resources → client/resources}/modelOperations.d.ts +57 -51
- package/dist/client/resources/modelOperations.d.ts.map +1 -0
- package/dist/{resources → client/resources}/modelOperations.js +1 -1
- package/dist/client/resources/modelOperations.js.map +1 -0
- package/dist/{resources → client/resources}/mutationOptions.d.ts +4 -17
- package/dist/client/resources/mutationOptions.d.ts.map +1 -0
- package/dist/client/resources/mutationOptions.js.map +1 -0
- package/dist/client/resources/where.d.ts.map +1 -0
- package/dist/{resources → client/resources}/where.js +1 -1
- package/dist/client/resources/where.js.map +1 -0
- package/dist/{resources → client/resources}/writeOptionsSchema.d.ts +16 -35
- package/dist/client/resources/writeOptionsSchema.d.ts.map +1 -0
- package/dist/{resources → client/resources}/writeOptionsSchema.js +25 -18
- package/dist/client/resources/writeOptionsSchema.js.map +1 -0
- package/dist/{transactions → commit}/confirmation/commitEnvelope.d.ts +1 -37
- package/dist/commit/confirmation/commitEnvelope.d.ts.map +1 -0
- package/dist/{transactions → commit}/confirmation/commitEnvelope.js +2 -7
- package/dist/commit/confirmation/commitEnvelope.js.map +1 -0
- package/dist/commit/confirmation/httpCommitEnvelope.d.ts.map +1 -0
- package/dist/{transactions → commit}/confirmation/httpCommitEnvelope.js +1 -1
- package/dist/commit/confirmation/httpCommitEnvelope.js.map +1 -0
- package/dist/commit/confirmation/idempotencyKey.d.ts.map +1 -0
- package/dist/commit/confirmation/idempotencyKey.js.map +1 -0
- package/dist/{transactions → commit}/confirmation/pendingWrite.d.ts +2 -33
- package/dist/commit/confirmation/pendingWrite.d.ts.map +1 -0
- package/dist/{transactions → commit}/confirmation/pendingWrite.js +1 -1
- package/dist/commit/confirmation/pendingWrite.js.map +1 -0
- package/dist/commit/contract.d.ts +1404 -0
- package/dist/commit/contract.d.ts.map +1 -0
- package/dist/{wire/commit.js → commit/contract.js} +26 -21
- package/dist/commit/contract.js.map +1 -0
- package/dist/{durableWrites.d.ts → commit/durableWrites.d.ts} +6 -6
- package/dist/commit/durableWrites.d.ts.map +1 -0
- package/dist/{durableWrites.js → commit/durableWrites.js} +5 -5
- package/dist/commit/durableWrites.js.map +1 -0
- package/dist/commit/httpRequest.d.ts +45 -0
- package/dist/commit/httpRequest.d.ts.map +1 -0
- package/dist/commit/httpRequest.js +66 -0
- package/dist/commit/httpRequest.js.map +1 -0
- package/dist/commit/index.d.ts +17 -0
- package/dist/commit/index.d.ts.map +1 -0
- package/dist/commit/index.js +17 -0
- package/dist/commit/index.js.map +1 -0
- package/dist/{readSetContext.d.ts → commit/readSetContext.d.ts} +7 -15
- package/dist/commit/readSetContext.d.ts.map +1 -0
- package/dist/{readSetContext.js → commit/readSetContext.js} +18 -28
- package/dist/commit/readSetContext.js.map +1 -0
- package/dist/{commitRecordRuntime.d.ts → commit/recordRuntime.d.ts} +3 -5
- package/dist/commit/recordRuntime.d.ts.map +1 -0
- package/dist/{commitRecordRuntime.js → commit/recordRuntime.js} +13 -54
- package/dist/commit/recordRuntime.js.map +1 -0
- package/dist/coordination/index.d.ts +6 -8
- package/dist/coordination/index.d.ts.map +1 -1
- package/dist/coordination/index.js +3 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/schema.d.ts +11 -466
- package/dist/coordination/schema.d.ts.map +1 -1
- package/dist/coordination/schema.js +13 -265
- package/dist/coordination/schema.js.map +1 -1
- package/dist/errorCodes.d.ts +16 -9
- package/dist/errorCodes.d.ts.map +1 -1
- package/dist/errorCodes.js +14 -6
- package/dist/errorCodes.js.map +1 -1
- package/dist/errorObservation.d.ts +2 -2
- package/dist/errors.d.ts +3 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +27 -11
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/internal/read-set.d.ts +3 -3
- package/dist/internal/read-set.d.ts.map +1 -1
- package/dist/internal/read-set.js +2 -2
- package/dist/internal/read-set.js.map +1 -1
- package/dist/observability.d.ts +4 -4
- package/dist/observability.d.ts.map +1 -1
- package/dist/observability.js +2 -2
- package/dist/{wire/delta.d.ts → observation/contract.d.ts} +8 -8
- package/dist/observation/contract.d.ts.map +1 -0
- package/dist/{wire/delta.js → observation/contract.js} +3 -3
- package/dist/observation/contract.js.map +1 -0
- package/dist/{wire/feedCursor.d.ts → observation/cursor.d.ts} +1 -1
- package/dist/observation/cursor.d.ts.map +1 -0
- package/dist/{wire/feedCursor.js → observation/cursor.js} +1 -1
- package/dist/observation/cursor.js.map +1 -0
- package/dist/{wire/deltaDelivery.d.ts → observation/deliveryContract.d.ts} +1 -1
- package/dist/observation/deliveryContract.d.ts.map +1 -0
- package/dist/{wire/deltaDelivery.js → observation/deliveryContract.js} +1 -1
- package/dist/observation/deliveryContract.js.map +1 -0
- package/dist/{wire/feedEvent.d.ts → observation/feedContract.d.ts} +10 -10
- package/dist/observation/feedContract.d.ts.map +1 -0
- package/dist/{wire/feedEvent.js → observation/feedContract.js} +4 -4
- package/dist/observation/feedContract.js.map +1 -0
- package/dist/observation/httpFeed.d.ts +4 -0
- package/dist/observation/httpFeed.d.ts.map +1 -0
- package/dist/{transport → observation}/httpFeed.js +1 -1
- package/dist/{transport → observation}/httpFeed.js.map +1 -1
- package/dist/observation/index.d.ts +13 -0
- package/dist/observation/index.d.ts.map +1 -0
- package/dist/observation/index.js +13 -0
- package/dist/observation/index.js.map +1 -0
- package/dist/{log → observation/persistence}/syncDeltaRow.d.ts +8 -8
- package/dist/observation/persistence/syncDeltaRow.d.ts.map +1 -0
- package/dist/{log → observation/persistence}/syncDeltaRow.js +4 -4
- package/dist/observation/persistence/syncDeltaRow.js.map +1 -0
- package/dist/pricing.d.ts +20 -12
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +46 -26
- package/dist/pricing.js.map +1 -1
- package/dist/schema/audit.d.ts +15 -0
- package/dist/schema/audit.d.ts.map +1 -0
- package/dist/schema/audit.js +90 -0
- package/dist/schema/audit.js.map +1 -0
- package/dist/schema/ddl.d.ts.map +1 -1
- package/dist/schema/ddl.js +68 -1
- package/dist/schema/ddl.js.map +1 -1
- package/dist/schema/index.d.ts +7 -6
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +6 -7
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/model.d.ts +14 -27
- package/dist/schema/model.d.ts.map +1 -1
- package/dist/schema/model.js +2 -2
- package/dist/schema/model.js.map +1 -1
- package/dist/schema/openapi.d.ts.map +1 -1
- package/dist/schema/openapi.js +149 -8
- package/dist/schema/openapi.js.map +1 -1
- package/dist/schema/roles.d.ts +27 -0
- package/dist/schema/roles.d.ts.map +1 -1
- package/dist/schema/roles.js +40 -0
- package/dist/schema/roles.js.map +1 -1
- package/dist/schema/schema.d.ts +34 -7
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +39 -3
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/serialize.d.ts +5 -5
- package/dist/schema/serialize.d.ts.map +1 -1
- package/dist/schema/serialize.js +5 -5
- package/dist/schema/serialize.js.map +1 -1
- package/dist/schema/subject.d.ts +18 -0
- package/dist/schema/subject.d.ts.map +1 -0
- package/dist/schema/subject.js +27 -0
- package/dist/schema/subject.js.map +1 -0
- package/dist/schema/tenancy.d.ts +1 -1
- package/dist/server/adapter.d.ts +3 -1
- package/dist/server/adapter.d.ts.map +1 -1
- package/dist/server/commit.d.ts +6 -14
- package/dist/server/commit.d.ts.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/readConfig.d.ts +3 -0
- package/dist/server/readConfig.d.ts.map +1 -1
- package/dist/server/readConfig.js +0 -21
- package/dist/server/readConfig.js.map +1 -1
- package/dist/server/storageMode.d.ts +1 -1
- package/dist/source/{adapter.d.ts → adapters/adapter.d.ts} +10 -4
- package/dist/source/adapters/adapter.d.ts.map +1 -0
- package/dist/source/adapters/adapter.js.map +1 -0
- package/dist/source/adapters/adapterFactory.d.ts.map +1 -0
- package/dist/source/{adapterFactory.js → adapters/adapterFactory.js} +1 -1
- package/dist/source/adapters/adapterFactory.js.map +1 -0
- package/dist/source/adapters/adapterProfile.d.ts.map +1 -0
- package/dist/source/adapters/adapterProfile.js.map +1 -0
- package/dist/source/{conformance.d.ts → adapters/conformance.d.ts} +1 -1
- package/dist/source/adapters/conformance.d.ts.map +1 -0
- package/dist/source/{conformance.js → adapters/conformance.js} +1 -1
- package/dist/source/adapters/conformance.js.map +1 -0
- package/dist/source/{contract.d.ts → adapters/contract.d.ts} +20 -75
- package/dist/source/adapters/contract.d.ts.map +1 -0
- package/dist/source/{contract.js → adapters/contract.js} +20 -55
- package/dist/source/adapters/contract.js.map +1 -0
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.d.ts.map +1 -1
- package/dist/source/adapters/drizzle.js +54 -25
- package/dist/source/adapters/drizzle.js.map +1 -1
- package/dist/source/adapters/idempotency.d.ts.map +1 -0
- package/dist/source/{idempotency.js → adapters/idempotency.js} +2 -2
- package/dist/source/adapters/idempotency.js.map +1 -0
- package/dist/source/adapters/index.d.ts +21 -0
- package/dist/source/adapters/index.d.ts.map +1 -0
- package/dist/source/adapters/index.js +21 -0
- package/dist/source/adapters/index.js.map +1 -0
- package/dist/source/adapters/kysely.d.ts +3 -1
- package/dist/source/adapters/kysely.d.ts.map +1 -1
- package/dist/source/adapters/kysely.js +49 -23
- package/dist/source/adapters/kysely.js.map +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +6 -3
- package/dist/source/adapters/kyselyMutationCore.d.ts.map +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +17 -8
- package/dist/source/adapters/kyselyMutationCore.js.map +1 -1
- package/dist/source/adapters/memory.d.ts +3 -3
- package/dist/source/adapters/memory.d.ts.map +1 -1
- package/dist/source/adapters/memory.js +20 -7
- package/dist/source/adapters/memory.js.map +1 -1
- package/dist/source/adapters/migration.d.ts +8 -0
- package/dist/source/adapters/migration.d.ts.map +1 -0
- package/dist/source/adapters/migration.js +9 -0
- package/dist/source/adapters/migration.js.map +1 -0
- package/dist/source/{migrations.d.ts → adapters/migrations.d.ts} +3 -4
- package/dist/source/adapters/migrations.d.ts.map +1 -0
- package/dist/source/{migrations.js → adapters/migrations.js} +4 -31
- package/dist/source/adapters/migrations.js.map +1 -0
- package/dist/source/adapters/prisma.d.ts +1 -1
- package/dist/source/adapters/prisma.d.ts.map +1 -1
- package/dist/source/adapters/prisma.js +75 -30
- package/dist/source/adapters/prisma.js.map +1 -1
- package/dist/source/adapters/subjectAuthorization.d.ts +16 -0
- package/dist/source/adapters/subjectAuthorization.d.ts.map +1 -0
- package/dist/source/adapters/subjectAuthorization.js +126 -0
- package/dist/source/adapters/subjectAuthorization.js.map +1 -0
- package/dist/source/{connector.d.ts → connector/client.d.ts} +6 -1
- package/dist/source/connector/client.d.ts.map +1 -0
- package/dist/source/{connector.js → connector/client.js} +28 -11
- package/dist/source/connector/client.js.map +1 -0
- package/dist/source/connector/index.d.ts +4 -0
- package/dist/source/connector/index.d.ts.map +1 -0
- package/dist/source/connector/index.js +4 -0
- package/dist/source/connector/index.js.map +1 -0
- package/dist/source/{connectorProtocol.d.ts → connector/protocol.d.ts} +8 -1
- package/dist/source/connector/protocol.d.ts.map +1 -0
- package/dist/source/{connectorProtocol.js → connector/protocol.js} +10 -3
- package/dist/source/connector/protocol.js.map +1 -0
- package/dist/source/delivery/index.d.ts +3 -0
- package/dist/source/delivery/index.d.ts.map +1 -0
- package/dist/source/delivery/index.js +3 -0
- package/dist/source/delivery/index.js.map +1 -0
- package/dist/source/{pushQueue.d.ts → delivery/pushQueue.d.ts} +1 -1
- package/dist/source/delivery/pushQueue.d.ts.map +1 -0
- package/dist/source/{pushQueue.js → delivery/pushQueue.js} +1 -1
- package/dist/source/delivery/pushQueue.js.map +1 -0
- package/dist/source/{factory.d.ts → endpoint/factory.d.ts} +9 -3
- package/dist/source/endpoint/factory.d.ts.map +1 -0
- package/dist/source/{factory.js → endpoint/factory.js} +122 -6
- package/dist/source/endpoint/factory.js.map +1 -0
- package/dist/source/endpoint/index.d.ts +5 -0
- package/dist/source/endpoint/index.d.ts.map +1 -0
- package/dist/source/endpoint/index.js +5 -0
- package/dist/source/endpoint/index.js.map +1 -0
- package/dist/source/{next.d.ts → endpoint/next.d.ts} +2 -2
- package/dist/source/endpoint/next.d.ts.map +1 -0
- package/dist/source/{next.js → endpoint/next.js} +1 -1
- package/dist/source/endpoint/next.js.map +1 -0
- package/dist/source/{signing.d.ts → endpoint/signing.d.ts} +1 -1
- package/dist/source/endpoint/signing.d.ts.map +1 -0
- package/dist/source/{signing.js → endpoint/signing.js} +1 -1
- package/dist/source/endpoint/signing.js.map +1 -0
- package/dist/source/index.d.ts +15 -12
- package/dist/source/index.d.ts.map +1 -1
- package/dist/source/index.js +13 -10
- package/dist/source/index.js.map +1 -1
- package/dist/source/outbox/contract.d.ts +50 -0
- package/dist/source/outbox/contract.d.ts.map +1 -0
- package/dist/source/outbox/contract.js +50 -0
- package/dist/source/outbox/contract.js.map +1 -0
- package/dist/source/outbox/envelope.d.ts +9 -0
- package/dist/source/outbox/envelope.d.ts.map +1 -0
- package/dist/source/outbox/envelope.js +36 -0
- package/dist/source/outbox/envelope.js.map +1 -0
- package/dist/source/outbox/index.d.ts +11 -0
- package/dist/source/outbox/index.d.ts.map +1 -0
- package/dist/source/outbox/index.js +11 -0
- package/dist/source/outbox/index.js.map +1 -0
- package/dist/source/outbox/migrations.d.ts +4 -0
- package/dist/source/outbox/migrations.d.ts.map +1 -0
- package/dist/source/outbox/migrations.js +67 -0
- package/dist/source/outbox/migrations.js.map +1 -0
- package/dist/source/outbox/retention.d.ts +3 -0
- package/dist/source/outbox/retention.d.ts.map +1 -0
- package/dist/source/outbox/retention.js +3 -0
- package/dist/source/outbox/retention.js.map +1 -0
- package/dist/source/types.d.ts +59 -10
- package/dist/source/types.d.ts.map +1 -1
- package/dist/source/types.js +2 -0
- package/dist/source/types.js.map +1 -1
- package/dist/syncLog/contract.d.ts +19 -8
- package/dist/syncLog/contract.d.ts.map +1 -1
- package/dist/syncLog/contract.js +19 -6
- package/dist/syncLog/contract.js.map +1 -1
- package/dist/testing/fixtures/httpResponses.d.ts +6 -0
- package/dist/testing/fixtures/httpResponses.d.ts.map +1 -1
- package/dist/testing/fixtures/httpResponses.js +1 -0
- package/dist/testing/fixtures/httpResponses.js.map +1 -1
- package/dist/transport/{credentialLifecycle.d.ts → connection/credentialLifecycle.d.ts} +3 -3
- package/dist/transport/connection/credentialLifecycle.d.ts.map +1 -0
- package/dist/transport/{credentialLifecycle.js → connection/credentialLifecycle.js} +2 -2
- package/dist/transport/connection/credentialLifecycle.js.map +1 -0
- package/dist/transport/connection/index.d.ts +5 -0
- package/dist/transport/connection/index.d.ts.map +1 -0
- package/dist/transport/connection/index.js +5 -0
- package/dist/transport/connection/index.js.map +1 -0
- package/dist/transport/{connectionManager.d.ts → connection/manager.d.ts} +13 -5
- package/dist/transport/connection/manager.d.ts.map +1 -0
- package/dist/transport/{connectionManager.js → connection/manager.js} +6 -4
- package/dist/transport/connection/manager.js.map +1 -0
- package/dist/transport/{networkProbe.d.ts → connection/networkProbe.d.ts} +2 -2
- package/dist/transport/connection/networkProbe.d.ts.map +1 -0
- package/dist/transport/{networkProbe.js → connection/networkProbe.js} +4 -4
- package/dist/transport/connection/networkProbe.js.map +1 -0
- package/dist/transport/{httpClient.d.ts → http/client.d.ts} +32 -44
- package/dist/transport/http/client.d.ts.map +1 -0
- package/dist/transport/{httpClient.js → http/client.js} +96 -105
- package/dist/transport/http/client.js.map +1 -0
- package/dist/transport/http/helpers.d.ts +10 -0
- package/dist/transport/http/helpers.d.ts.map +1 -0
- package/dist/transport/http/helpers.js +46 -0
- package/dist/transport/http/helpers.js.map +1 -0
- package/dist/transport/http/index.d.ts +6 -0
- package/dist/transport/http/index.d.ts.map +1 -0
- package/dist/transport/http/index.js +6 -0
- package/dist/transport/http/index.js.map +1 -0
- package/dist/transport/{httpOptions.d.ts → http/options.d.ts} +7 -7
- package/dist/transport/{httpOptions.d.ts.map → http/options.d.ts.map} +1 -1
- package/dist/transport/{httpOptions.js → http/options.js} +1 -1
- package/dist/transport/http/options.js.map +1 -0
- package/dist/transport/http/subscription.d.ts +16 -0
- package/dist/transport/http/subscription.d.ts.map +1 -0
- package/dist/transport/http/subscription.js +146 -0
- package/dist/transport/http/subscription.js.map +1 -0
- package/dist/transport/{httpTransport.d.ts → http/transport.d.ts} +9 -6
- package/dist/transport/http/transport.d.ts.map +1 -0
- package/dist/transport/{httpTransport.js → http/transport.js} +153 -188
- package/dist/transport/http/transport.js.map +1 -0
- package/dist/transport/index.d.ts +8 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +8 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/{commitFrames.d.ts → websocket/commitFrames.d.ts} +8 -20
- package/dist/transport/websocket/commitFrames.d.ts.map +1 -0
- package/dist/transport/{commitFrames.js → websocket/commitFrames.js} +6 -25
- package/dist/transport/websocket/commitFrames.js.map +1 -0
- package/dist/transport/{wsFrameHandlers.d.ts → websocket/frameHandlers.d.ts} +5 -5
- package/dist/transport/websocket/frameHandlers.d.ts.map +1 -0
- package/dist/transport/{wsFrameHandlers.js → websocket/frameHandlers.js} +10 -51
- package/dist/transport/websocket/frameHandlers.js.map +1 -0
- package/dist/transport/{heartbeat.d.ts → websocket/heartbeat.d.ts} +1 -1
- package/dist/transport/websocket/heartbeat.d.ts.map +1 -0
- package/dist/transport/{heartbeat.js → websocket/heartbeat.js} +2 -2
- package/dist/transport/websocket/heartbeat.js.map +1 -0
- package/dist/transport/websocket/index.d.ts +6 -0
- package/dist/transport/websocket/index.d.ts.map +1 -0
- package/dist/transport/websocket/index.js +6 -0
- package/dist/transport/websocket/index.js.map +1 -0
- package/dist/transport/{wsTransport.d.ts → websocket/transport.d.ts} +13 -25
- package/dist/transport/websocket/transport.d.ts.map +1 -0
- package/dist/transport/{wsTransport.js → websocket/transport.js} +14 -14
- package/dist/transport/websocket/transport.js.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/streams.d.ts +8 -48
- package/dist/types/streams.d.ts.map +1 -1
- package/dist/types/streams.js +2 -2
- package/dist/wire/accountResponses.d.ts +4 -72
- package/dist/wire/accountResponses.d.ts.map +1 -1
- package/dist/wire/accountResponses.js +2 -10
- package/dist/wire/accountResponses.js.map +1 -1
- package/dist/wire/apiLifecycle.d.ts +63 -0
- package/dist/wire/apiLifecycle.d.ts.map +1 -0
- package/dist/wire/apiLifecycle.js +89 -0
- package/dist/wire/apiLifecycle.js.map +1 -0
- package/dist/wire/frames.d.ts +6 -83
- package/dist/wire/frames.d.ts.map +1 -1
- package/dist/wire/frames.js +4 -11
- package/dist/wire/frames.js.map +1 -1
- package/dist/wire/inboundFrames.d.ts +6 -131
- package/dist/wire/inboundFrames.d.ts.map +1 -1
- package/dist/wire/inboundFrames.js +3 -3
- package/dist/wire/inboundFrames.js.map +1 -1
- package/dist/wire/index.d.ts +20 -15
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +22 -8
- package/dist/wire/index.js.map +1 -1
- package/dist/wire/modelMutations.d.ts +1 -32
- package/dist/wire/modelMutations.d.ts.map +1 -1
- package/dist/wire/modelMutations.js +1 -8
- package/dist/wire/modelMutations.js.map +1 -1
- package/dist/wire/rateLimit.d.ts +82 -0
- package/dist/wire/rateLimit.d.ts.map +1 -0
- package/dist/wire/rateLimit.js +142 -0
- package/dist/wire/rateLimit.js.map +1 -0
- package/package.json +130 -10
- package/src/ai-sdk/modelTools.ts +5 -5
- package/src/ai-sdk/updateTool.ts +5 -7
- package/src/auth/capability.ts +5 -0
- package/src/auth/capabilityLifecycle.ts +1 -1
- package/src/auth/credentialPolicy.ts +1 -1
- package/src/auth/identity.ts +7 -7
- package/src/auth/index.ts +4 -663
- package/src/auth/runtime.ts +669 -0
- package/src/auth/sessionMint.ts +3 -2
- package/src/branches.ts +3 -0
- package/src/{coordination/awaitClaimGrant.ts → claims/awaitGrant.ts} +4 -4
- package/src/{wire/claims.ts → claims/contract.ts} +1 -1
- package/src/{coordination → claims}/events.ts +7 -11
- package/src/claims/index.ts +21 -0
- package/src/claims/lifetime.ts +78 -0
- package/src/{coordination → claims}/locator.ts +3 -3
- package/src/claims/routes.ts +81 -0
- package/src/{coordination → claims}/trace.ts +5 -5
- package/src/{ablo.ts → client/ablo.ts} +8 -20
- package/src/{transactionLayer.ts → client/contract.ts} +11 -13
- package/src/{headlessClient.ts → client/headless.ts} +13 -15
- package/src/client/index.ts +10 -0
- package/src/{resources → client/resources}/functionalUpdate.ts +4 -4
- package/src/{resources → client/resources}/httpResources.ts +163 -92
- package/src/client/resources/modelCreate.ts +73 -0
- package/src/{resources → client/resources}/modelOperations.ts +73 -55
- package/src/{resources → client/resources}/mutationOptions.ts +4 -17
- package/src/{resources → client/resources}/where.ts +1 -1
- package/src/{resources → client/resources}/writeOptionsSchema.ts +35 -27
- package/src/{transactions → commit}/confirmation/commitEnvelope.ts +2 -12
- package/src/{transactions → commit}/confirmation/httpCommitEnvelope.ts +1 -1
- package/src/{transactions → commit}/confirmation/pendingWrite.ts +1 -1
- package/src/{wire/commit.ts → commit/contract.ts} +27 -26
- package/src/{durableWrites.ts → commit/durableWrites.ts} +7 -7
- package/src/commit/httpRequest.ts +103 -0
- package/src/commit/index.ts +16 -0
- package/src/{readSetContext.ts → commit/readSetContext.ts} +24 -43
- package/src/{commitRecordRuntime.ts → commit/recordRuntime.ts} +12 -67
- package/src/coordination/index.ts +4 -54
- package/src/coordination/schema.ts +15 -309
- package/src/errorCodes.ts +62 -10
- package/src/errors.ts +32 -10
- package/src/index.ts +8 -8
- package/src/internal/read-set.ts +3 -6
- package/src/observability.ts +4 -4
- package/src/{wire/delta.ts → observation/contract.ts} +2 -2
- package/src/{wire/feedEvent.ts → observation/feedContract.ts} +3 -4
- package/src/{transport → observation}/httpFeed.ts +3 -3
- package/src/observation/index.ts +12 -0
- package/src/{log → observation/persistence}/syncDeltaRow.ts +6 -7
- package/src/pricing.ts +46 -25
- package/src/schema/audit.ts +121 -0
- package/src/schema/ddl.ts +71 -1
- package/src/schema/index.ts +20 -20
- package/src/schema/model.ts +17 -33
- package/src/schema/openapi.ts +170 -9
- package/src/schema/roles.ts +53 -0
- package/src/schema/schema.ts +91 -6
- package/src/schema/serialize.ts +8 -9
- package/src/schema/subject.ts +43 -0
- package/src/server/adapter.ts +3 -1
- package/src/server/commit.ts +6 -14
- package/src/server/index.ts +1 -1
- package/src/server/readConfig.ts +4 -0
- package/src/source/{adapter.ts → adapters/adapter.ts} +9 -5
- package/src/source/{adapterFactory.ts → adapters/adapterFactory.ts} +1 -1
- package/src/source/{conformance.ts → adapters/conformance.ts} +1 -1
- package/src/source/{contract.ts → adapters/contract.ts} +24 -61
- package/src/source/adapters/drizzle.ts +75 -29
- package/src/source/{idempotency.ts → adapters/idempotency.ts} +2 -2
- package/src/source/adapters/index.ts +20 -0
- package/src/source/adapters/kysely.ts +77 -27
- package/src/source/adapters/kyselyMutationCore.ts +23 -11
- package/src/source/adapters/memory.ts +26 -9
- package/src/source/adapters/migration.ts +11 -0
- package/src/source/{migrations.ts → adapters/migrations.ts} +6 -33
- package/src/source/adapters/prisma.ts +98 -34
- package/src/source/adapters/subjectAuthorization.ts +182 -0
- package/src/source/{connector.ts → connector/client.ts} +35 -12
- package/src/source/connector/index.ts +3 -0
- package/src/source/{connectorProtocol.ts → connector/protocol.ts} +10 -2
- package/src/source/delivery/index.ts +2 -0
- package/src/source/{pushQueue.ts → delivery/pushQueue.ts} +2 -2
- package/src/source/{factory.ts → endpoint/factory.ts} +150 -9
- package/src/source/endpoint/index.ts +4 -0
- package/src/source/{next.ts → endpoint/next.ts} +2 -2
- package/src/source/{signing.ts → endpoint/signing.ts} +1 -1
- package/src/source/index.ts +27 -18
- package/src/source/outbox/contract.ts +56 -0
- package/src/source/outbox/envelope.ts +47 -0
- package/src/source/outbox/index.ts +15 -0
- package/src/source/outbox/migrations.ts +71 -0
- package/src/source/outbox/retention.ts +2 -0
- package/src/source/types.ts +64 -10
- package/src/syncLog/contract.ts +19 -9
- package/src/testing/fixtures/httpResponses.ts +7 -0
- package/src/transport/{credentialLifecycle.ts → connection/credentialLifecycle.ts} +3 -3
- package/src/transport/connection/index.ts +4 -0
- package/src/transport/{connectionManager.ts → connection/manager.ts} +13 -4
- package/src/transport/{networkProbe.ts → connection/networkProbe.ts} +4 -4
- package/src/transport/{httpClient.ts → http/client.ts} +165 -184
- package/src/transport/http/helpers.ts +63 -0
- package/src/transport/http/index.ts +5 -0
- package/src/transport/{httpOptions.ts → http/options.ts} +6 -6
- package/src/transport/http/subscription.ts +174 -0
- package/src/transport/{httpTransport.ts → http/transport.ts} +210 -246
- package/src/transport/index.ts +7 -0
- package/src/transport/{commitFrames.ts → websocket/commitFrames.ts} +14 -46
- package/src/transport/{wsFrameHandlers.ts → websocket/frameHandlers.ts} +11 -54
- package/src/transport/{heartbeat.ts → websocket/heartbeat.ts} +2 -2
- package/src/transport/websocket/index.ts +5 -0
- package/src/transport/{wsTransport.ts → websocket/transport.ts} +16 -30
- package/src/types/index.ts +2 -6
- package/src/types/streams.ts +7 -61
- package/src/webhooks/events.ts +1 -1
- package/src/wire/accountResponses.ts +3 -12
- package/src/wire/apiLifecycle.ts +94 -0
- package/src/wire/frames.ts +5 -15
- package/src/wire/inboundFrames.ts +3 -3
- package/src/wire/index.ts +50 -15
- package/src/wire/modelMutations.ts +1 -14
- package/src/wire/rateLimit.ts +155 -0
- package/dist/ablo.d.ts.map +0 -1
- package/dist/ablo.js.map +0 -1
- package/dist/commitRecordRuntime.d.ts.map +0 -1
- package/dist/commitRecordRuntime.js.map +0 -1
- package/dist/coordination/awaitClaimGrant.d.ts.map +0 -1
- package/dist/coordination/awaitClaimGrant.js.map +0 -1
- package/dist/coordination/claimHeartbeatLoop.d.ts.map +0 -1
- package/dist/coordination/claimHeartbeatLoop.js.map +0 -1
- package/dist/coordination/claimMeta.d.ts.map +0 -1
- package/dist/coordination/claimMeta.js.map +0 -1
- package/dist/coordination/events.d.ts.map +0 -1
- package/dist/coordination/events.js +0 -8
- package/dist/coordination/events.js.map +0 -1
- package/dist/coordination/locator.d.ts.map +0 -1
- package/dist/coordination/locator.js.map +0 -1
- package/dist/coordination/targetConflict.d.ts.map +0 -1
- package/dist/coordination/targetConflict.js.map +0 -1
- package/dist/coordination/trace.d.ts.map +0 -1
- package/dist/coordination/trace.js.map +0 -1
- package/dist/durableWrites.d.ts.map +0 -1
- package/dist/durableWrites.js.map +0 -1
- package/dist/headlessClient.d.ts.map +0 -1
- package/dist/log/syncDeltaRow.d.ts.map +0 -1
- package/dist/log/syncDeltaRow.js.map +0 -1
- package/dist/policy/types.d.ts +0 -226
- package/dist/policy/types.d.ts.map +0 -1
- package/dist/policy/types.js +0 -127
- package/dist/policy/types.js.map +0 -1
- package/dist/readSetContext.d.ts.map +0 -1
- package/dist/readSetContext.js.map +0 -1
- package/dist/resources/functionalUpdate.d.ts.map +0 -1
- package/dist/resources/functionalUpdate.js.map +0 -1
- package/dist/resources/httpResources.d.ts.map +0 -1
- package/dist/resources/httpResources.js +0 -17
- package/dist/resources/httpResources.js.map +0 -1
- package/dist/resources/modelOperations.d.ts.map +0 -1
- package/dist/resources/modelOperations.js.map +0 -1
- package/dist/resources/mutationOptions.d.ts.map +0 -1
- package/dist/resources/mutationOptions.js.map +0 -1
- package/dist/resources/where.d.ts.map +0 -1
- package/dist/resources/where.js.map +0 -1
- package/dist/resources/writeOptionsSchema.d.ts.map +0 -1
- package/dist/resources/writeOptionsSchema.js.map +0 -1
- package/dist/schema/coordination.d.ts +0 -113
- package/dist/schema/coordination.d.ts.map +0 -1
- package/dist/schema/coordination.js +0 -134
- package/dist/schema/coordination.js.map +0 -1
- package/dist/source/adapter.d.ts.map +0 -1
- package/dist/source/adapter.js.map +0 -1
- package/dist/source/adapterFactory.d.ts.map +0 -1
- package/dist/source/adapterFactory.js.map +0 -1
- package/dist/source/adapterProfile.d.ts.map +0 -1
- package/dist/source/adapterProfile.js.map +0 -1
- package/dist/source/conformance.d.ts.map +0 -1
- package/dist/source/conformance.js.map +0 -1
- package/dist/source/connector.d.ts.map +0 -1
- package/dist/source/connector.js.map +0 -1
- package/dist/source/connectorProtocol.d.ts.map +0 -1
- package/dist/source/connectorProtocol.js.map +0 -1
- package/dist/source/contract.d.ts.map +0 -1
- package/dist/source/contract.js.map +0 -1
- package/dist/source/drizzle.d.ts +0 -2
- package/dist/source/drizzle.d.ts.map +0 -1
- package/dist/source/drizzle.js +0 -2
- package/dist/source/drizzle.js.map +0 -1
- package/dist/source/factory.d.ts.map +0 -1
- package/dist/source/factory.js.map +0 -1
- package/dist/source/idempotency.d.ts.map +0 -1
- package/dist/source/idempotency.js.map +0 -1
- package/dist/source/kysely.d.ts +0 -3
- package/dist/source/kysely.d.ts.map +0 -1
- package/dist/source/kysely.js +0 -3
- package/dist/source/kysely.js.map +0 -1
- package/dist/source/migrations.d.ts.map +0 -1
- package/dist/source/migrations.js.map +0 -1
- package/dist/source/next.d.ts.map +0 -1
- package/dist/source/next.js.map +0 -1
- package/dist/source/pushQueue.d.ts.map +0 -1
- package/dist/source/pushQueue.js.map +0 -1
- package/dist/source/signing.d.ts.map +0 -1
- package/dist/source/signing.js.map +0 -1
- package/dist/transactionLayer.d.ts.map +0 -1
- package/dist/transactionLayer.js.map +0 -1
- package/dist/transactions/confirmation/commitEnvelope.d.ts.map +0 -1
- package/dist/transactions/confirmation/commitEnvelope.js.map +0 -1
- package/dist/transactions/confirmation/httpCommitEnvelope.d.ts.map +0 -1
- package/dist/transactions/confirmation/httpCommitEnvelope.js.map +0 -1
- package/dist/transactions/confirmation/idempotencyKey.d.ts.map +0 -1
- package/dist/transactions/confirmation/idempotencyKey.js.map +0 -1
- package/dist/transactions/confirmation/pendingWrite.d.ts.map +0 -1
- package/dist/transactions/confirmation/pendingWrite.js.map +0 -1
- package/dist/transport/commitFrames.d.ts.map +0 -1
- package/dist/transport/commitFrames.js.map +0 -1
- package/dist/transport/connectionManager.d.ts.map +0 -1
- package/dist/transport/connectionManager.js.map +0 -1
- package/dist/transport/credentialLifecycle.d.ts.map +0 -1
- package/dist/transport/credentialLifecycle.js.map +0 -1
- package/dist/transport/heartbeat.d.ts.map +0 -1
- package/dist/transport/heartbeat.js.map +0 -1
- package/dist/transport/httpClient.d.ts.map +0 -1
- package/dist/transport/httpClient.js.map +0 -1
- package/dist/transport/httpFeed.d.ts +0 -4
- package/dist/transport/httpFeed.d.ts.map +0 -1
- package/dist/transport/httpOptions.js.map +0 -1
- package/dist/transport/httpTransport.d.ts.map +0 -1
- package/dist/transport/httpTransport.js.map +0 -1
- package/dist/transport/networkProbe.d.ts.map +0 -1
- package/dist/transport/networkProbe.js.map +0 -1
- package/dist/transport/wsFrameHandlers.d.ts.map +0 -1
- package/dist/transport/wsFrameHandlers.js.map +0 -1
- package/dist/transport/wsTransport.d.ts.map +0 -1
- package/dist/transport/wsTransport.js.map +0 -1
- package/dist/wire/claimEvent.d.ts.map +0 -1
- package/dist/wire/claimEvent.js.map +0 -1
- package/dist/wire/claims.d.ts.map +0 -1
- package/dist/wire/claims.js.map +0 -1
- package/dist/wire/commit.d.ts +0 -2801
- package/dist/wire/commit.d.ts.map +0 -1
- package/dist/wire/commit.js.map +0 -1
- package/dist/wire/delta.d.ts.map +0 -1
- package/dist/wire/delta.js.map +0 -1
- package/dist/wire/deltaDelivery.d.ts.map +0 -1
- package/dist/wire/deltaDelivery.js.map +0 -1
- package/dist/wire/feedCursor.d.ts.map +0 -1
- package/dist/wire/feedCursor.js.map +0 -1
- package/dist/wire/feedEvent.d.ts.map +0 -1
- package/dist/wire/feedEvent.js.map +0 -1
- package/src/policy/types.ts +0 -300
- package/src/schema/coordination.ts +0 -161
- package/src/source/drizzle.ts +0 -1
- package/src/source/kysely.ts +0 -2
- /package/dist/{coordination → claims}/targetConflict.d.ts +0 -0
- /package/dist/{coordination → claims}/targetConflict.js +0 -0
- /package/dist/{resources → client/resources}/mutationOptions.js +0 -0
- /package/dist/{resources → client/resources}/where.d.ts +0 -0
- /package/dist/{transactions → commit}/confirmation/httpCommitEnvelope.d.ts +0 -0
- /package/dist/{transactions → commit}/confirmation/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → commit}/confirmation/idempotencyKey.js +0 -0
- /package/dist/source/{adapter.js → adapters/adapter.js} +0 -0
- /package/dist/source/{adapterFactory.d.ts → adapters/adapterFactory.d.ts} +0 -0
- /package/dist/source/{adapterProfile.d.ts → adapters/adapterProfile.d.ts} +0 -0
- /package/dist/source/{adapterProfile.js → adapters/adapterProfile.js} +0 -0
- /package/dist/source/{idempotency.d.ts → adapters/idempotency.d.ts} +0 -0
- /package/src/{wire/claimEvent.ts → claims/eventContract.ts} +0 -0
- /package/src/{coordination/claimHeartbeatLoop.ts → claims/heartbeat.ts} +0 -0
- /package/src/{coordination/claimMeta.ts → claims/meta.ts} +0 -0
- /package/src/{coordination → claims}/targetConflict.ts +0 -0
- /package/src/{transactions → commit}/confirmation/idempotencyKey.ts +0 -0
- /package/src/{wire/feedCursor.ts → observation/cursor.ts} +0 -0
- /package/src/{wire/deltaDelivery.ts → observation/deliveryContract.ts} +0 -0
- /package/src/source/{adapterProfile.ts → adapters/adapterProfile.ts} +0 -0
|
@@ -7,11 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
import type {
|
|
9
9
|
ClaimHeartbeatAckPayload,
|
|
10
|
-
OnStaleMode,
|
|
11
10
|
ReadDependency,
|
|
12
|
-
|
|
13
|
-
} from '
|
|
14
|
-
import type { ClaimHeartbeatReply, ClaimState } from '../wire/claims.js';
|
|
11
|
+
} from '../../coordination/schema.js';
|
|
12
|
+
import type { ClaimHeartbeatReply, ClaimState } from '../../claims/contract.js';
|
|
15
13
|
import type {
|
|
16
14
|
ClientCommitReceipt,
|
|
17
15
|
CommitWait,
|
|
@@ -19,10 +17,13 @@ import type {
|
|
|
19
17
|
CommitRecordList,
|
|
20
18
|
CommitRecordListOptions,
|
|
21
19
|
CommitRecordWhere,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
CommitOperationBody,
|
|
21
|
+
ModelOperationAction,
|
|
22
|
+
} from '../../commit/contract.js';
|
|
23
|
+
import type { LogListResponse, LogQuery } from '../../observation/feedContract.js';
|
|
24
|
+
import type { ModelListEvidence } from '../../wire/modelResponses.js';
|
|
25
|
+
import { AbloValidationError } from '../../errors.js';
|
|
26
|
+
// Re-exported, not redeclared. `commit/contract.ts` owns the commit-status vocabulary
|
|
26
27
|
// and derives the waitable subset from it; this module serves that name to SDK
|
|
27
28
|
// consumers. Restating the subset here as its own union produced a type that
|
|
28
29
|
// matched the canonical one only by both happening to list the same two
|
|
@@ -33,36 +34,34 @@ export type { CommitWait };
|
|
|
33
34
|
// claim view) are defined in `../coordination/schema`, derived from a single
|
|
34
35
|
// schema so the client, the HTTP client, and the server share one definition.
|
|
35
36
|
// They are re-exported here so the resource types live behind one import.
|
|
36
|
-
import type { ModelTarget, ModelClaim } from '
|
|
37
|
+
import type { ModelTarget, ModelClaim } from '../../coordination/schema.js';
|
|
37
38
|
export type { ModelTarget, ModelClaim };
|
|
38
|
-
import type { ResolveClaimMeta } from '
|
|
39
|
-
import type { ParticipantKind } from '
|
|
40
|
-
import type { SchemaRecord } from '
|
|
41
|
-
import type { SyncGroupInput } from '
|
|
39
|
+
import type { ResolveClaimMeta } from '../../types/global.js';
|
|
40
|
+
import type { ParticipantKind } from '../../types/participant.js';
|
|
41
|
+
import type { SchemaRecord } from '../../schema/schema.js';
|
|
42
|
+
import type { SyncGroupInput } from '../../schema/roles.js';
|
|
42
43
|
// The capability vocabulary — `auth/capability.ts` owns what a grant is on both
|
|
43
44
|
// axes, and these params are the surface a developer declares it through.
|
|
44
45
|
import type {
|
|
45
46
|
CapabilityCan,
|
|
46
47
|
CapabilityOperation,
|
|
47
48
|
EffectiveAuthority,
|
|
48
|
-
} from '
|
|
49
|
+
} from '../../auth/capability.js';
|
|
49
50
|
import type {
|
|
50
51
|
Claim,
|
|
51
52
|
ClaimStream,
|
|
52
53
|
ClaimWaitOptions,
|
|
53
54
|
Duration,
|
|
54
55
|
HeldClaim,
|
|
55
|
-
} from '
|
|
56
|
+
} from '../../types/streams.js';
|
|
56
57
|
import type { ModelUpdater, FunctionalUpdateOptions } from './functionalUpdate.js';
|
|
57
58
|
import type {
|
|
58
59
|
ClaimOptions,
|
|
59
60
|
ClaimAttemptEvent,
|
|
60
|
-
|
|
61
|
-
ClaimSkipParams,
|
|
61
|
+
ClaimCall,
|
|
62
62
|
ClaimReadApi,
|
|
63
63
|
AwaitedClaimMethod,
|
|
64
|
-
|
|
65
|
-
ModelTrackResult,
|
|
64
|
+
ModelCreateManyParams,
|
|
66
65
|
ServerReadOptions,
|
|
67
66
|
} from './modelOperations.js';
|
|
68
67
|
|
|
@@ -70,19 +69,15 @@ import type {
|
|
|
70
69
|
|
|
71
70
|
/**
|
|
72
71
|
* The operations available on each model in the sync engine:
|
|
73
|
-
* `get({ id })` — an async single-row server read
|
|
72
|
+
* `get({ id })` — an observational async single-row server read
|
|
73
|
+
* `read({ id })` — an async single-row server read that may guard a write
|
|
74
74
|
* `list({ where })` — an async collection server read
|
|
75
75
|
* `local.get(id)` / `local.list(...)` / `local.count(...)` — synchronous local reads
|
|
76
76
|
* `create({ data })` / `update({ id, data })` / `delete({ id })` — writes
|
|
77
77
|
* `claim({ id })` — a durable claim handle for coordinated writes
|
|
78
78
|
*/
|
|
79
79
|
|
|
80
|
-
export type ModelOperationAction
|
|
81
|
-
| 'create'
|
|
82
|
-
| 'update'
|
|
83
|
-
| 'delete'
|
|
84
|
-
| 'archive'
|
|
85
|
-
| 'unarchive';
|
|
80
|
+
export type { ModelOperationAction };
|
|
86
81
|
|
|
87
82
|
|
|
88
83
|
/** @internal Transport envelope; the public typed client returns the row. */
|
|
@@ -130,20 +125,119 @@ export interface HttpTransportList<T = Record<string, unknown>> {
|
|
|
130
125
|
* and a complete one the same value, so the caller with 500 matching rows got
|
|
131
126
|
* 20 and no way to find out.
|
|
132
127
|
*/
|
|
133
|
-
export type ModelList<T> = T[] & Pick<HttpTransportList<T>, 'hasMore' | 'nextCursor'
|
|
128
|
+
export type ModelList<T> = T[] & Pick<HttpTransportList<T>, 'hasMore' | 'nextCursor'> &
|
|
129
|
+
AsyncIterable<T>;
|
|
134
130
|
|
|
135
131
|
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
132
|
+
* How far a `for await` over a list will walk before it gives up.
|
|
133
|
+
*
|
|
134
|
+
* A cursor that stops advancing would otherwise spin forever. The bound is
|
|
135
|
+
* high enough that no real collection reaches it and low enough that a broken
|
|
136
|
+
* server is a failed read rather than a hung process.
|
|
137
|
+
*/
|
|
138
|
+
const AUTO_PAGE_LIMIT = 10_000;
|
|
139
|
+
const LIST_ALL_PAGE_LIMIT = 100;
|
|
140
|
+
|
|
141
|
+
const nextPageFor = new WeakMap<object, (cursor: string) => Promise<ModelList<unknown>>>();
|
|
142
|
+
|
|
143
|
+
export interface ModelListWalkOptions {
|
|
144
|
+
readonly maxPages?: number;
|
|
145
|
+
readonly signal?: AbortSignal;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function* walkModelList<T>(
|
|
149
|
+
first: ModelList<T>,
|
|
150
|
+
options: ModelListWalkOptions = {},
|
|
151
|
+
): AsyncGenerator<T> {
|
|
152
|
+
const maxPages = options.maxPages ?? AUTO_PAGE_LIMIT;
|
|
153
|
+
if (!Number.isInteger(maxPages) || maxPages < 1) {
|
|
154
|
+
throw new AbloValidationError('maxPages must be a positive integer.', {
|
|
155
|
+
code: 'invalid_options',
|
|
156
|
+
param: 'maxPages',
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
let current = first;
|
|
161
|
+
for (let visited = 0; visited < maxPages; visited += 1) {
|
|
162
|
+
options.signal?.throwIfAborted();
|
|
163
|
+
for (let i = 0; i < current.length; i += 1) {
|
|
164
|
+
options.signal?.throwIfAborted();
|
|
165
|
+
yield current[i] as T;
|
|
166
|
+
}
|
|
167
|
+
const cursor = current.nextCursor;
|
|
168
|
+
const fetchNext = nextPageFor.get(current) as
|
|
169
|
+
| ((nextCursor: string) => Promise<ModelList<T>>)
|
|
170
|
+
| undefined;
|
|
171
|
+
if (!current.hasMore || cursor === null || fetchNext === undefined) return;
|
|
172
|
+
const next = await fetchNext(cursor);
|
|
173
|
+
if (next.nextCursor === cursor) {
|
|
174
|
+
throw new AbloValidationError(
|
|
175
|
+
`Walking this list received the same continuation cursor twice (${JSON.stringify(cursor)}). ` +
|
|
176
|
+
'The collection may be incomplete, so traversal stopped with an error.',
|
|
177
|
+
{ code: 'malformed_response', param: 'nextCursor' },
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
current = next;
|
|
181
|
+
}
|
|
182
|
+
throw new AbloValidationError(
|
|
183
|
+
`Walking this list passed ${maxPages} pages without reaching the end. ` +
|
|
184
|
+
`Narrow the read with \`where\` or raise \`maxPages\` deliberately.`,
|
|
185
|
+
{ code: 'invalid_options', param: 'maxPages' },
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Collect a complete list through the same guarded cursor loop as async iteration. */
|
|
190
|
+
export async function collectModelList<T>(
|
|
191
|
+
first: ModelList<T>,
|
|
192
|
+
options: ModelListWalkOptions = {},
|
|
193
|
+
): Promise<T[]> {
|
|
194
|
+
const rows: T[] = [];
|
|
195
|
+
for await (const row of walkModelList(first, {
|
|
196
|
+
maxPages: options.maxPages ?? LIST_ALL_PAGE_LIMIT,
|
|
197
|
+
signal: options.signal,
|
|
198
|
+
})) rows.push(row);
|
|
199
|
+
return rows;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Attach the page state to the rows, and make the list walk its own pages.
|
|
204
|
+
*
|
|
205
|
+
* `hasMore` and `nextCursor` are non-enumerable, so the result stays
|
|
206
|
+
* indistinguishable from a plain array everywhere they are not read: it maps,
|
|
207
|
+
* filters, spreads, and `JSON.stringify`s exactly as the rows always did.
|
|
208
|
+
*
|
|
209
|
+
* The async iterator is the answer to the question that shape raises. A list
|
|
210
|
+
* read is a page — the server applies a default size and caps the largest —
|
|
211
|
+
* and a page of 20 looks precisely like a complete answer of 20, so every
|
|
212
|
+
* caller either checked `hasMore` or, far more often, reasoned about a
|
|
213
|
+
* truncated set without knowing it. Hand-rolled page walkers were the common
|
|
214
|
+
* result, and each one re-derived the same cursor loop and the same
|
|
215
|
+
* non-advancing-cursor guard.
|
|
216
|
+
*
|
|
217
|
+
* So iterate the value to get the page, and `for await` it to get the
|
|
218
|
+
* collection:
|
|
219
|
+
*
|
|
220
|
+
* ```ts
|
|
221
|
+
* const page = await ablo.issue.list({ where: { teamId } });
|
|
222
|
+
* for (const issue of page) … // the 20 rows that came back
|
|
223
|
+
* for await (const issue of page) … // every issue, paged as it goes
|
|
224
|
+
* ```
|
|
138
225
|
*/
|
|
139
226
|
export function modelList<T>(
|
|
140
227
|
rows: readonly T[],
|
|
141
228
|
page: Pick<HttpTransportList<unknown>, 'hasMore' | 'nextCursor'>,
|
|
229
|
+
/** Reads the page after `cursor`. Omitted where no transport can follow. */
|
|
230
|
+
fetchNext?: (cursor: string) => Promise<ModelList<T>>,
|
|
142
231
|
): ModelList<T> {
|
|
143
|
-
|
|
232
|
+
const list = Object.defineProperties([...rows], {
|
|
144
233
|
hasMore: { value: page.hasMore, enumerable: false },
|
|
145
234
|
nextCursor: { value: page.nextCursor, enumerable: false },
|
|
235
|
+
[Symbol.asyncIterator]: { value: () => walkModelList(list), enumerable: false },
|
|
146
236
|
}) as ModelList<T>;
|
|
237
|
+
if (fetchNext) {
|
|
238
|
+
nextPageFor.set(list, fetchNext as (cursor: string) => Promise<ModelList<unknown>>);
|
|
239
|
+
}
|
|
240
|
+
return list;
|
|
147
241
|
}
|
|
148
242
|
|
|
149
243
|
export type IfClaimedPolicy = 'return' | 'fail';
|
|
@@ -158,7 +252,7 @@ export interface ClaimedOptions {
|
|
|
158
252
|
readonly ifClaimed?: IfClaimedPolicy;
|
|
159
253
|
}
|
|
160
254
|
|
|
161
|
-
export type { ClaimWaitOptions } from '
|
|
255
|
+
export type { ClaimWaitOptions } from '../../types/streams.js';
|
|
162
256
|
|
|
163
257
|
export interface ModelReadOptions extends ClaimedOptions {}
|
|
164
258
|
|
|
@@ -206,35 +300,22 @@ export interface ClaimCreateOptions {
|
|
|
206
300
|
readonly onStatus?: (event: ClaimAttemptEvent) => void;
|
|
207
301
|
}
|
|
208
302
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
readonly id?: string | null;
|
|
214
|
-
readonly data?: Record<string, unknown> | null;
|
|
215
|
-
readonly where?: Record<string, unknown> | null;
|
|
216
|
-
readonly transactionId?: string | null;
|
|
217
|
-
/** Claim identity derived from a held claim; not an application id. */
|
|
218
|
-
readonly claimId?: string | null;
|
|
219
|
-
readonly readAt?: number | null;
|
|
220
|
-
readonly onStale?: OnStaleMode | null;
|
|
221
|
-
/** Fencing token (Option B) from the batch's claim handle; server-validated. */
|
|
222
|
-
readonly fenceToken?: number | null;
|
|
223
|
-
}
|
|
303
|
+
/** Public commit operation inferred from the canonical request-body schema. */
|
|
304
|
+
export type CommitOperationInput = CommitOperationBody;
|
|
305
|
+
|
|
306
|
+
export type CommitClaim = Omit<Claim<unknown>, 'data'>;
|
|
224
307
|
|
|
225
|
-
export interface CommitCreateOptions {
|
|
308
|
+
export interface CommitCreateOptions<Read = ReadDependency> {
|
|
226
309
|
readonly idempotencyKey?: string | null;
|
|
227
310
|
readonly readAt?: number | null;
|
|
228
|
-
readonly onStale?: OnStaleMode | null;
|
|
229
311
|
/**
|
|
230
312
|
* A claim handle from `ablo.<model>.claim({ id })` (or the HTTP claim
|
|
231
313
|
* surface). Same vocabulary as the per-model writes: the handle's
|
|
232
|
-
* snapshot watermark becomes the batch `readAt` default
|
|
233
|
-
* defaults to `'reject'`, so a commit that follows a claim is guarded
|
|
314
|
+
* snapshot watermark becomes the batch `readAt` default, so a commit that follows a claim is guarded
|
|
234
315
|
* against concurrent edits without re-stating the watermark by hand.
|
|
235
|
-
*
|
|
316
|
+
* An explicit `readAt` on the options wins.
|
|
236
317
|
*/
|
|
237
|
-
readonly claim?:
|
|
318
|
+
readonly claim?: CommitClaim | null;
|
|
238
319
|
/** One atomic batch. Use a one-element array for a single operation. */
|
|
239
320
|
readonly operations: readonly CommitOperationInput[];
|
|
240
321
|
readonly wait?: CommitWait;
|
|
@@ -242,27 +323,17 @@ export interface CommitCreateOptions {
|
|
|
242
323
|
* The batch premise — the "did anything I looked at change?" guard.
|
|
243
324
|
* Declare the rows (`{ model, id, readAt, fields? }`) or sync groups
|
|
244
325
|
* (`{ group, readAt }`, for example `report:abc`) this batch was premised on; the
|
|
245
|
-
* server
|
|
246
|
-
* over the batch. This is distinct from the write-target `readAt`: it guards what
|
|
326
|
+
* server rejects the batch if any moved since `readAt`. This is distinct from the write-target `readAt`: it guards what
|
|
247
327
|
* you read, not what you write.
|
|
248
328
|
*/
|
|
249
|
-
readonly reads?: readonly
|
|
250
|
-
/**
|
|
251
|
-
* Durable premises to register as part of this batch — the persisted
|
|
252
|
-
* sibling of `reads`. Where `reads` guards only this commit, a `track` entry
|
|
253
|
-
* (`{ model, id, readAt? }` for a row or `{ group, readAt? }` for a sync group)
|
|
254
|
-
* lives on past it: a later matching change rides back on a future receipt's
|
|
255
|
-
* `notifications`. A track-only batch (just `track`, an empty `operations`) is
|
|
256
|
-
* the batch form of `ablo.<model>.track()`.
|
|
257
|
-
*/
|
|
258
|
-
readonly track?: readonly TrackDependency[] | null;
|
|
329
|
+
readonly reads?: readonly Read[] | null;
|
|
259
330
|
}
|
|
260
331
|
|
|
261
332
|
/** Public projection inferred from the canonical runtime schema. */
|
|
262
333
|
export type CommitReceipt = ClientCommitReceipt;
|
|
263
334
|
|
|
264
|
-
export interface CommitResource {
|
|
265
|
-
create(options: CommitCreateOptions): Promise<CommitReceipt>;
|
|
335
|
+
export interface CommitResource<Read = ReadDependency> {
|
|
336
|
+
create(options: CommitCreateOptions<Read>): Promise<CommitReceipt>;
|
|
266
337
|
get(options: { readonly id: string }): Promise<CommitRecord | null>;
|
|
267
338
|
list(options?: CommitRecordListOptions): Promise<CommitRecordList>;
|
|
268
339
|
}
|
|
@@ -330,15 +401,16 @@ export interface HttpClaimsResource {
|
|
|
330
401
|
}
|
|
331
402
|
|
|
332
403
|
export interface ModelMutationOptions extends ClaimedOptions {
|
|
333
|
-
readonly claimRef?: string | { readonly id: string } | null;
|
|
334
404
|
readonly idempotencyKey?: string | null;
|
|
335
|
-
readonly readAt?: number | null;
|
|
336
|
-
readonly onStale?: OnStaleMode | null;
|
|
337
405
|
/** Commit-lifetime read dependencies checked before this mutation lands. */
|
|
338
406
|
readonly reads?: readonly ReadDependency[] | null;
|
|
339
|
-
/** Persisted read dependencies registered by this mutation. */
|
|
340
|
-
readonly track?: readonly TrackDependency[] | null;
|
|
341
407
|
readonly claim?: Claim | ClaimOptions | null;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/** Internal fields derived from a claim or functional update, never authored on a model write. */
|
|
411
|
+
export interface InternalModelMutationOptions extends ModelMutationOptions {
|
|
412
|
+
readonly claimRef?: string | { readonly id: string } | null;
|
|
413
|
+
readonly readAt?: number | null;
|
|
342
414
|
/** Fencing token (Option B) from the claim; server-validated at commit. */
|
|
343
415
|
readonly fenceToken?: number | null;
|
|
344
416
|
}
|
|
@@ -349,7 +421,7 @@ export interface ModelMutationOptions extends ClaimedOptions {
|
|
|
349
421
|
* namespace for multi-step handles and coordination screens.
|
|
350
422
|
*
|
|
351
423
|
* It is the same surface as the reactive claim API, but because every read is a
|
|
352
|
-
* server round-trip, `state`, `queue`, and `reorder` are awaited here. The
|
|
424
|
+
* server round-trip, `state`, `list`, `queue`, and `reorder` are awaited here. The
|
|
353
425
|
* WebSocket client resolves those synchronously from its local cache, which is what
|
|
354
426
|
* lets it read a claim's state inside a React render; a stateless client has no
|
|
355
427
|
* cache to read, so the promise is unavoidable.
|
|
@@ -357,19 +429,14 @@ export interface ModelMutationOptions extends ClaimedOptions {
|
|
|
357
429
|
* It is derived from `ClaimReadApi` through {@link AwaitedClaimMethod} so the two
|
|
358
430
|
* transports cannot drift: the only difference is the promise wrapper that
|
|
359
431
|
* statelessness forces. `claim({ id })` is identical on both (already async);
|
|
360
|
-
* `state`, `queue`, `reorder`, and `release` are the awaited form.
|
|
432
|
+
* `state`, `list`, `queue`, `reorder`, and `release` are the awaited form.
|
|
361
433
|
*/
|
|
362
434
|
export type HttpClaimApi<
|
|
363
435
|
T = Record<string, unknown>,
|
|
364
436
|
Fields = T,
|
|
365
|
-
> =
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
// resolves a held claim or rejects with a queue error.
|
|
369
|
-
((params: ClaimSkipParams<Fields>) => Promise<HeldClaim<T> | null>) &
|
|
370
|
-
((params: ClaimParams<Fields>) => Promise<HeldClaim<T>>) & {
|
|
371
|
-
[K in keyof ClaimReadApi<T>]: AwaitedClaimMethod<ClaimReadApi<T>[K]>;
|
|
372
|
-
};
|
|
437
|
+
> = ClaimCall<T, Fields> & {
|
|
438
|
+
[K in keyof ClaimReadApi<T>]: AwaitedClaimMethod<ClaimReadApi<T>[K]>;
|
|
439
|
+
};
|
|
373
440
|
|
|
374
441
|
/** @internal String-keyed model routing owned by the private HTTP transport. */
|
|
375
442
|
export interface HttpTransportModel<
|
|
@@ -385,10 +452,7 @@ export interface HttpTransportModel<
|
|
|
385
452
|
*
|
|
386
453
|
* Public callers never see this shape; `createAbloHttpClient` unwraps it.
|
|
387
454
|
*/
|
|
388
|
-
|
|
389
|
-
get(params: ModelReadOptions & { readonly id: string }): Promise<HttpTransportRead<T>>;
|
|
390
|
-
/** @deprecated Use `get({ id })`; retained for the private transport compatibility seam. */
|
|
391
|
-
retrieve(params: ModelReadOptions & { readonly id: string }): Promise<HttpTransportRead<T>>;
|
|
455
|
+
read(params: ModelReadOptions & { readonly id: string }): Promise<HttpTransportRead<T>>;
|
|
392
456
|
/**
|
|
393
457
|
* Collection read over HTTP (server round-trip). Equality `where`, `orderBy`,
|
|
394
458
|
* and `limit`. The typed public client always exposes `ablo.<model>.list`;
|
|
@@ -402,6 +466,12 @@ export interface HttpTransportModel<
|
|
|
402
466
|
* returned, not the input.
|
|
403
467
|
*/
|
|
404
468
|
create(params: ModelMutationOptions & { readonly data: Record<string, unknown>; readonly id?: string | null }): Promise<T>;
|
|
469
|
+
/**
|
|
470
|
+
* Creates many rows as one atomic commit and returns them, in the caller's
|
|
471
|
+
* order. One rejected row declines the batch. The rows are the server's own,
|
|
472
|
+
* carried back on the commit rather than read again afterwards.
|
|
473
|
+
*/
|
|
474
|
+
createMany(params: ModelCreateManyParams<Record<string, unknown>>): Promise<T[]>;
|
|
405
475
|
update(params: ModelMutationOptions & { readonly id: string; readonly data: Record<string, unknown> }): Promise<CommitReceipt>;
|
|
406
476
|
/**
|
|
407
477
|
* Update under contention with a function of the latest state —
|
|
@@ -425,13 +495,6 @@ export interface HttpTransportModel<
|
|
|
425
495
|
* schema-agnostic shape stays inside the HTTP transport.
|
|
426
496
|
*/
|
|
427
497
|
claim: HttpClaimApi<T, Fields>;
|
|
428
|
-
/**
|
|
429
|
-
* Registers a durable premise on a row — request/response, no socket. A track
|
|
430
|
-
* declares what a caller is watching; it keeps no local copy of the row, so it
|
|
431
|
-
* belongs to every transport rather than to the reactive client (ADR 0013 §4).
|
|
432
|
-
* The typed public clients expose it as `ablo.<model>.track`.
|
|
433
|
-
*/
|
|
434
|
-
track(params: ModelTrackParams): Promise<ModelTrackResult>;
|
|
435
498
|
}
|
|
436
499
|
|
|
437
500
|
/** A single data operation a scoped **agent** session may perform on a model.
|
|
@@ -480,6 +543,11 @@ export interface CreateUserSessionParams<S extends SchemaRecord> {
|
|
|
480
543
|
export interface CreateAgentSessionParams<S extends SchemaRecord> {
|
|
481
544
|
/** Your agent. `id` becomes the token's `participantId`. */
|
|
482
545
|
agent: { id: string };
|
|
546
|
+
/** The authenticated person who started this agent run. The backend holding
|
|
547
|
+
* the secret key attests this identity, and every resulting delta records
|
|
548
|
+
* the agent as actor plus this user as `onBehalfOf`. Persist the user id on
|
|
549
|
+
* durable work before enqueueing it so a later worker can supply it here. */
|
|
550
|
+
onBehalfOf?: { readonly user: { readonly id: string } };
|
|
483
551
|
/** Per-model operation allowlist, typed against the schema's model names. */
|
|
484
552
|
can: CapabilityCan<S>;
|
|
485
553
|
/** Sync groups this session may subscribe to — typed (`'default'` or
|
|
@@ -512,6 +580,9 @@ export interface CreateAgentClientParams<S extends SchemaRecord> {
|
|
|
512
580
|
* Pass a stable string only when one logical agent must re-attach to its own
|
|
513
581
|
* held claims across reconnects or restarts. */
|
|
514
582
|
id?: string;
|
|
583
|
+
/** The authenticated person who started this run. Preserving it on durable
|
|
584
|
+
* work and supplying it here gives every write dual-principal attribution. */
|
|
585
|
+
onBehalfOf?: { readonly user: { readonly id: string } };
|
|
515
586
|
/** A human-readable label for logs and attribution (carried in `userMeta.name`).
|
|
516
587
|
* It is independent of `id`: two agents that share a `name` still receive
|
|
517
588
|
* distinct ids and coordinate as separate participants — `name` never derives or
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** Canonical create identity and result correlation shared by every client. */
|
|
2
|
+
|
|
3
|
+
import { v5 as uuidv5 } from 'uuid';
|
|
4
|
+
import { AbloConnectionError } from '../../errors.js';
|
|
5
|
+
import type { CommitOperationResult } from '../../commit/contract.js';
|
|
6
|
+
|
|
7
|
+
/** Resolve the two supported single-create id spellings. The sibling wins. */
|
|
8
|
+
export function resolveCreateId(
|
|
9
|
+
explicitId: string | null | undefined,
|
|
10
|
+
data: unknown,
|
|
11
|
+
): string | undefined {
|
|
12
|
+
if (typeof explicitId === 'string' && explicitId.length > 0) return explicitId;
|
|
13
|
+
const inData =
|
|
14
|
+
typeof data === 'object' && data !== null
|
|
15
|
+
? (data as { readonly id?: unknown }).id
|
|
16
|
+
: undefined;
|
|
17
|
+
return typeof inData === 'string' && inData.length > 0 ? inData : undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Stable across transports and client instances when an idempotency key is supplied. */
|
|
21
|
+
export function createModelId(
|
|
22
|
+
modelName: string,
|
|
23
|
+
idempotencyKey?: string | null,
|
|
24
|
+
): string {
|
|
25
|
+
if (idempotencyKey) {
|
|
26
|
+
return uuidv5(
|
|
27
|
+
`${modelName}:${idempotencyKey}`,
|
|
28
|
+
'aa4ba6d4-bf0b-5b38-9c45-116f79a6e548',
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
return typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'
|
|
32
|
+
? crypto.randomUUID()
|
|
33
|
+
: `id_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Return server-authored create rows in input order.
|
|
38
|
+
*
|
|
39
|
+
* Fresh receipts carry operationResults. Durable idempotency replays redact
|
|
40
|
+
* row data, so that path verifies every expected id with a point read. It may
|
|
41
|
+
* fail under a write-only policy, but it can never report a partial collection
|
|
42
|
+
* as success.
|
|
43
|
+
*/
|
|
44
|
+
export async function resolveCreatedRows<T>(input: {
|
|
45
|
+
readonly modelName: string;
|
|
46
|
+
readonly ids: readonly string[];
|
|
47
|
+
readonly operationResults?: readonly CommitOperationResult[];
|
|
48
|
+
readonly readRow: (id: string) => Promise<T | undefined>;
|
|
49
|
+
}): Promise<T[]> {
|
|
50
|
+
if (input.operationResults?.length === input.ids.length) {
|
|
51
|
+
const byId = new Map(
|
|
52
|
+
input.operationResults.map((result) => [
|
|
53
|
+
(result.row as { readonly id?: unknown }).id,
|
|
54
|
+
result.row,
|
|
55
|
+
]),
|
|
56
|
+
);
|
|
57
|
+
const ordered = input.ids.map((id) => byId.get(id));
|
|
58
|
+
if (ordered.every((row): row is Record<string, unknown> => row !== undefined)) {
|
|
59
|
+
return ordered as T[];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const rows = await Promise.all(input.ids.map((id) => input.readRow(id)));
|
|
64
|
+
const missing = input.ids.filter((_id, index) => rows[index] === undefined);
|
|
65
|
+
if (missing.length > 0) {
|
|
66
|
+
throw new AbloConnectionError(
|
|
67
|
+
`${input.modelName} create confirmed, but ${missing.length} of ${input.ids.length} ` +
|
|
68
|
+
'server rows could not be recovered from its receipt or verified by id.',
|
|
69
|
+
{ code: 'commit_no_result', details: { missingIds: missing } },
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return rows as T[];
|
|
73
|
+
}
|