@abloatai/ablo 0.34.1 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +758 -5
- package/README.md +56 -502
- package/bin/ablo.cjs +39 -0
- package/dist/BaseSyncedStore.d.ts +176 -48
- package/dist/BaseSyncedStore.js +346 -214
- package/dist/Database.d.ts +17 -44
- package/dist/Database.js +96 -79
- package/dist/InstanceCache.d.ts +31 -6
- package/dist/InstanceCache.js +65 -30
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +23 -13
- package/dist/Model.js +27 -17
- package/dist/ModelRegistry.d.ts +8 -4
- package/dist/ModelRegistry.js +20 -18
- package/dist/NetworkMonitor.d.ts +3 -1
- package/dist/NetworkMonitor.js +7 -5
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +47 -47
- package/dist/SyncClient.js +215 -156
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +129 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +8 -4
- package/dist/client/createInternalComponents.js +17 -10
- package/dist/client/createModelProxy.d.ts +98 -373
- package/dist/client/createModelProxy.js +233 -139
- package/dist/client/humans.d.ts +69 -0
- package/dist/client/humans.js +78 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +53 -0
- package/dist/client/reactiveEngine.js +688 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/storeCluster.d.ts +47 -0
- package/dist/client/storeCluster.js +118 -0
- package/dist/client/storeLifecycle.d.ts +61 -0
- package/dist/client/storeLifecycle.js +231 -0
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +22 -9
- package/dist/context.js +33 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +230 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +44 -36
- package/dist/index.js +30 -22
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +5 -2
- package/dist/query/client.js +10 -9
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +18 -8
- package/dist/react/AbloProvider.js +10 -9
- package/dist/react/context.d.ts +3 -3
- package/dist/react/context.js +1 -1
- package/dist/react/createAbloReact.d.ts +56 -0
- package/dist/react/createAbloReact.js +51 -0
- package/dist/react/index.d.ts +6 -5
- package/dist/react/index.js +6 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +12 -5
- package/dist/react/useAblo.js +26 -8
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +90 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +11 -10
- package/dist/schema/index.js +22 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +6 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +20 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapter.d.ts +7 -5
- package/dist/source/adapter.js +7 -5
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
- package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
- package/dist/{core → stores}/DatabaseManager.js +14 -13
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/{core → stores}/StoreManager.d.ts +9 -26
- package/dist/{core → stores}/StoreManager.js +29 -77
- package/dist/stores/SyncActionStore.d.ts +4 -2
- package/dist/stores/SyncActionStore.js +11 -17
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +127 -6
- package/dist/sync/BootstrapFetcher.js +511 -83
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +5 -2
- package/dist/sync/OnDemandLoader.js +61 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/bootstrapApply.d.ts +3 -0
- package/dist/sync/bootstrapApply.js +2 -2
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +13 -12
- package/dist/sync/deltaPipeline.js +21 -4
- package/dist/sync/groupChange.d.ts +3 -0
- package/dist/sync/groupChange.js +16 -14
- package/dist/sync/participants.d.ts +24 -6
- package/dist/sync/participants.js +32 -23
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +23 -33
- package/dist/sync/schemas.js +29 -20
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/syncLog/contract.d.ts +20 -0
- package/dist/syncLog/contract.js +19 -0
- package/dist/syncLog/index.d.ts +1 -0
- package/dist/syncLog/index.js +1 -0
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +212 -0
- package/dist/transaction/auth/capability.js +224 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +45 -0
- package/dist/transaction/coordination/locator.d.ts +104 -0
- package/dist/transaction/coordination/locator.js +102 -0
- package/dist/transaction/coordination/schema.d.ts +1536 -0
- package/dist/transaction/coordination/schema.js +1177 -0
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +107 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
- package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/footprint.d.ts +111 -0
- package/dist/transaction/footprint.js +0 -0
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +285 -0
- package/dist/transaction/plugin.js +106 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +321 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +427 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +101 -0
- package/dist/transaction/resources/where.js +115 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +17 -23
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/fieldRef.d.ts +38 -0
- package/dist/transaction/schema/fieldRef.js +11 -0
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +58 -0
- package/dist/transaction/schema/openapi.js +501 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
- package/dist/{schema → transaction/schema}/schema.js +24 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/transaction/transport/httpClient.d.ts +131 -0
- package/dist/{client → transaction/transport}/httpClient.js +6 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +295 -97
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +574 -0
- package/dist/transaction/transport/wsTransport.js +1023 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +73 -45
- package/dist/transaction/utils/duration.d.ts +50 -0
- package/dist/{utils → transaction/utils}/duration.js +32 -0
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +420 -0
- package/dist/transaction/wire/accountResponses.js +290 -0
- package/dist/transaction/wire/auth.d.ts +56 -0
- package/dist/transaction/wire/auth.js +63 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +530 -0
- package/dist/transaction/wire/claims.js +327 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +204 -0
- package/dist/transaction/wire/feedEvent.js +65 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +562 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +54 -0
- package/dist/transaction/wire/index.js +83 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelMutations.d.ts +31 -0
- package/dist/transaction/wire/modelMutations.js +52 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transaction/wire/modelShape.d.ts +78 -0
- package/dist/transaction/wire/modelShape.js +74 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/{core → views}/QueryView.d.ts +2 -2
- package/dist/{core → views}/QueryView.js +2 -2
- package/dist/{core → views}/ViewRegistry.d.ts +1 -1
- package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
- package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +20 -13
- package/docs/api-keys.md +14 -10
- package/docs/api.md +27 -61
- package/docs/audit.md +6 -3
- package/docs/cli.md +41 -13
- package/docs/client-behavior.md +11 -9
- package/docs/concurrency-convention.md +49 -57
- package/docs/coordination.md +283 -121
- package/docs/data-sources.md +7 -5
- package/docs/debugging.md +39 -15
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +46 -45
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +87 -30
- package/docs/guarantees.md +41 -12
- package/docs/how-it-works.md +38 -12
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +77 -74
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +31 -19
- package/docs/mcp.md +46 -21
- package/docs/migration.md +95 -18
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +3 -1
- package/docs/quickstart.md +22 -5
- package/docs/react.md +31 -18
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +4 -2
- package/docs/webhooks.md +12 -10
- package/llms.txt +48 -18
- package/package.json +21 -26
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/cli.cjs +0 -286329
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/client/httpClient.d.ts +0 -80
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/coordination/schema.js +0 -578
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -192
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -71
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transactions/durableWriteStore.js +0 -30
- package/dist/utils/duration.d.ts +0 -25
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- package/docs/interaction-model.md +0 -97
- /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
- /package/dist/{core → query}/QueryProcessor.js +0 -0
- /package/dist/{core/storeContract.js → storeContract.js} +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
- /package/dist/{core → views}/ViewRegistry.js +0 -0
|
@@ -1,46 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* the
|
|
4
|
-
*
|
|
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; {@link SyncWebSocket} satisfies it.
|
|
2
|
+
* Moved to the settlement core (ADR 0016): claim push is coordination, and
|
|
3
|
+
* coordination is the product. This path re-exports it so existing importers
|
|
4
|
+
* stay unchanged.
|
|
14
5
|
*/
|
|
15
|
-
export
|
|
16
|
-
subscribe(event: 'claim_acquired' | 'claim_granted' | 'claim_lost' | 'claim_queued' | 'claim_rejected', handler: (payload: Record<string, unknown>) => void): () => void;
|
|
17
|
-
}
|
|
18
|
-
export interface ClaimGrantInfo {
|
|
19
|
-
/**
|
|
20
|
-
* True when the grant arrived as `claim_granted` — the target was held when
|
|
21
|
-
* the caller asked, and the caller waited in the FIFO line behind the holder.
|
|
22
|
-
* False for the immediate `claim_acquired`, where the target was free.
|
|
23
|
-
*
|
|
24
|
-
* Callers read this to know the row may have changed while they queued. Claim
|
|
25
|
-
* visibility is scoped to the entity, so a broad, organization-wide
|
|
26
|
-
* subscription receives no presence or claim fan-out, and the local
|
|
27
|
-
* coordination snapshot cannot be trusted to tell whether the caller waited.
|
|
28
|
-
* The grant frame itself is the authoritative signal.
|
|
29
|
-
*/
|
|
30
|
-
readonly waited: boolean;
|
|
31
|
-
/**
|
|
32
|
-
* The fencing token the server minted for this grant (Option B), read off the
|
|
33
|
-
* grant frame — the authoritative source, since the token is server-stamped.
|
|
34
|
-
* `undefined` when the server does not fence (no minter wired).
|
|
35
|
-
*/
|
|
36
|
-
readonly fenceToken?: number;
|
|
37
|
-
}
|
|
38
|
-
export declare function awaitClaimGrant(transport: GrantTransport, claimId: string, options?: {
|
|
39
|
-
timeoutMs?: number;
|
|
40
|
-
/**
|
|
41
|
-
* Backpressure: reject instead of waiting if, when we join the line, the
|
|
42
|
-
* server reports `position >= maxQueueDepth` (i.e. that many claims are
|
|
43
|
-
* already ahead of us). Omit to wait however deep the queue is.
|
|
44
|
-
*/
|
|
45
|
-
maxQueueDepth?: number;
|
|
46
|
-
}): Promise<ClaimGrantInfo>;
|
|
6
|
+
export { awaitClaimGrant, type GrantTransport, type ClaimGrantInfo, } from '../transaction/coordination/awaitClaimGrant.js';
|
|
@@ -1,111 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* the
|
|
4
|
-
*
|
|
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; {@link SyncWebSocket} satisfies it.
|
|
2
|
+
* Moved to the settlement core (ADR 0016): claim push is coordination, and
|
|
3
|
+
* coordination is the product. This path re-exports it so existing importers
|
|
4
|
+
* stay unchanged.
|
|
14
5
|
*/
|
|
15
|
-
|
|
16
|
-
import { getContext } from '../context.js';
|
|
17
|
-
/** Read the server-stamped fencing token off a grant frame, if present. */
|
|
18
|
-
function readFenceToken(p) {
|
|
19
|
-
return typeof p.fenceToken === 'number' ? p.fenceToken : undefined;
|
|
20
|
-
}
|
|
21
|
-
export function awaitClaimGrant(transport, claimId, options) {
|
|
22
|
-
return new Promise((resolve, reject) => {
|
|
23
|
-
const unsubs = [];
|
|
24
|
-
let timer;
|
|
25
|
-
const settle = (fn) => {
|
|
26
|
-
if (timer)
|
|
27
|
-
clearTimeout(timer);
|
|
28
|
-
for (const u of unsubs)
|
|
29
|
-
u();
|
|
30
|
-
fn();
|
|
31
|
-
};
|
|
32
|
-
// The target was free → `claim_acquired` (immediate); it was contended,
|
|
33
|
-
// we waited in line, and reached the head → `claim_granted`. Either frame
|
|
34
|
-
// means the lease is now ours; `waited` records which path it was.
|
|
35
|
-
unsubs.push(transport.subscribe('claim_acquired', (p) => {
|
|
36
|
-
if (p?.claimId === claimId) {
|
|
37
|
-
getContext().logger.debug(`claim: acquired ${claimId} (target was free)`);
|
|
38
|
-
const fenceToken = readFenceToken(p);
|
|
39
|
-
settle(() => {
|
|
40
|
-
resolve({ waited: false, ...(fenceToken !== undefined ? { fenceToken } : {}) });
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}));
|
|
44
|
-
unsubs.push(transport.subscribe('claim_granted', (p) => {
|
|
45
|
-
if (p?.claimId === claimId) {
|
|
46
|
-
// Promoted to the head of the line — the creator's "it's the agent's
|
|
47
|
-
// turn now" moment after waiting behind a holder.
|
|
48
|
-
getContext().logger.info(`claim: granted ${claimId} — your turn (waited in queue)`);
|
|
49
|
-
const fenceToken = readFenceToken(p);
|
|
50
|
-
settle(() => {
|
|
51
|
-
resolve({ waited: true, ...(fenceToken !== undefined ? { fenceToken } : {}) });
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}));
|
|
55
|
-
if (options?.maxQueueDepth !== undefined) {
|
|
56
|
-
const max = options.maxQueueDepth;
|
|
57
|
-
unsubs.push(transport.subscribe('claim_queued', (p) => {
|
|
58
|
-
if (p?.claimId !== claimId)
|
|
59
|
-
return;
|
|
60
|
-
const position = typeof p.position === 'number' ? p.position : 0;
|
|
61
|
-
if (position >= max) {
|
|
62
|
-
settle(() => {
|
|
63
|
-
reject(new AbloClaimedError(`Claim queue for ${claimId} is ${position} deep (max ${max}).`, { code: 'queue_too_deep' }));
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
}));
|
|
67
|
-
}
|
|
68
|
-
unsubs.push(transport.subscribe('claim_rejected', (p) => {
|
|
69
|
-
const rejection = p;
|
|
70
|
-
if (rejection.claimId !== claimId)
|
|
71
|
-
return;
|
|
72
|
-
const target = rejection.target
|
|
73
|
-
? claimTargetLabel({
|
|
74
|
-
model: rejection.target.entityType,
|
|
75
|
-
id: rejection.target.entityId,
|
|
76
|
-
field: rejection.target.field,
|
|
77
|
-
})
|
|
78
|
-
: claimId;
|
|
79
|
-
settle(() => {
|
|
80
|
-
reject(new AbloClaimedError(formatClaimedErrorMessage({
|
|
81
|
-
targetLabel: target,
|
|
82
|
-
heldBy: rejection.heldBy,
|
|
83
|
-
claim: rejection.heldByClaim,
|
|
84
|
-
policyReason: rejection.policyReason,
|
|
85
|
-
fallback: `Claim rejected for ${target}.`,
|
|
86
|
-
}), {
|
|
87
|
-
code: rejection.reason === 'conflict'
|
|
88
|
-
? 'claim_conflict'
|
|
89
|
-
: 'claim_lease_unavailable',
|
|
90
|
-
claims: rejection.heldByClaim ? [rejection.heldByClaim] : undefined,
|
|
91
|
-
}));
|
|
92
|
-
});
|
|
93
|
-
}));
|
|
94
|
-
unsubs.push(transport.subscribe('claim_lost', (p) => {
|
|
95
|
-
if (p?.claimId === claimId) {
|
|
96
|
-
settle(() => {
|
|
97
|
-
reject(new AbloClaimedError(`Claim lost while queued for ${claimId}.`, {
|
|
98
|
-
code: 'claim_lost',
|
|
99
|
-
}));
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}));
|
|
103
|
-
if (options?.timeoutMs && options.timeoutMs > 0) {
|
|
104
|
-
timer = setTimeout(() => {
|
|
105
|
-
settle(() => {
|
|
106
|
-
reject(new AbloClaimedError(`Timed out waiting for the queue grant on claim ${claimId}.`, { code: 'grant_timeout' }));
|
|
107
|
-
});
|
|
108
|
-
}, options.timeoutMs);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
6
|
+
export { awaitClaimGrant, } from '../transaction/coordination/awaitClaimGrant.js';
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* stale local copies the server no longer reports — are performed by the sync
|
|
14
14
|
* client behind that interface.
|
|
15
15
|
*/
|
|
16
|
+
import type { RuntimeContext } from '../RuntimeContext.js';
|
|
16
17
|
import type { BootstrapResult } from '../Database.js';
|
|
17
18
|
import type { SyncDelta } from './SyncWebSocket.js';
|
|
18
19
|
/** Counts describing what applying a bootstrap changed in the pool: entities
|
|
@@ -32,6 +33,8 @@ export interface RehydrationStats {
|
|
|
32
33
|
* takes effect through this interface.
|
|
33
34
|
*/
|
|
34
35
|
export interface PoolContext {
|
|
36
|
+
/** The owning client's runtime. Defaults to the module-global bridge. */
|
|
37
|
+
readonly runtime?: RuntimeContext;
|
|
35
38
|
/** Applies persisted delta results to the in-memory pool, with the host's relation enrichment bound. */
|
|
36
39
|
applyDeltaBatchToPool(results: NonNullable<BootstrapResult['deltaResults']>): void;
|
|
37
40
|
/** Writes bootstrap data into the pool: creates models, heals partial rows, upserts, and removes stale local copies the server no longer reports. */
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* stale local copies the server no longer reports — are performed by the sync
|
|
14
14
|
* client behind that interface.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
16
|
+
import { globalRuntime } from '../context.js';
|
|
17
17
|
/**
|
|
18
18
|
* Applies a bootstrap result to the in-memory pool and returns what changed.
|
|
19
19
|
* A full bootstrap creates, heals, and upserts models and removes stale local
|
|
@@ -42,7 +42,7 @@ export function applyBootstrapToPool(ctx, bootstrapResult, protectedIds) {
|
|
|
42
42
|
// Creates models, heals partial rows, upserts, and removes stale local copies.
|
|
43
43
|
const stats = ctx.applyBootstrapDataToPool(bootstrapData, protectedIds);
|
|
44
44
|
const elapsedMs = Math.round((typeof performance !== 'undefined' ? performance.now() : Date.now()) - start);
|
|
45
|
-
|
|
45
|
+
(ctx.runtime ?? globalRuntime).logger.info('[BaseSyncedStore] Bootstrap applied', {
|
|
46
46
|
...stats, elapsedMs, poolSize: ctx.getPoolSize(),
|
|
47
47
|
});
|
|
48
48
|
return { ...stats, elapsedMs };
|
|
@@ -1,42 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Moved to the settlement core with the duplex transport (ADR 0016): the
|
|
3
|
+
* commit-path frame builders are stateless wire helpers. This path re-exports
|
|
4
|
+
* them so existing importers stay unchanged. The core's `buildCommitFrame`
|
|
5
|
+
* takes the structural `CommitFrameOperation` slice, which this package's
|
|
6
|
+
* `MutationOperation` satisfies.
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
-
import type { CommitAck as CanonicalCommitAck } from '../wire/commit.js';
|
|
9
|
-
import type { MutationOperation, ClaimEvent } from '../interfaces/index.js';
|
|
10
|
-
import type { StaleNotification, ReadDependency, TrackDependency } from '../coordination/schema.js';
|
|
11
|
-
/**
|
|
12
|
-
* The value a commit acknowledgement resolves to. `notifications` is present
|
|
13
|
-
* only when a guarded write (`onStale: 'notify'`) met a concurrent change; it
|
|
14
|
-
* carries the advisory signal that lets the writer self-heal, and the same
|
|
15
|
-
* signal also arrives on the `conflict:notified` event.
|
|
16
|
-
*/
|
|
17
|
-
export type CommitAck = CanonicalCommitAck;
|
|
18
|
-
/**
|
|
19
|
-
* Converts the client's list of {@link MutationOperation} values into the wire
|
|
20
|
-
* {@link CommitMessage} the server accepts. This is the one place the loosely
|
|
21
|
-
* typed operation — its `type` is a string, and it carries client-only
|
|
22
|
-
* `options` the server never reads — becomes the strict wire contract. Mapping
|
|
23
|
-
* each field by hand means a change to {@link CommitOperation} fails to compile
|
|
24
|
-
* here; the single `as` cast narrows the validated `type` to the wire union and
|
|
25
|
-
* is the only place that loosening happens.
|
|
26
|
-
*/
|
|
27
|
-
export declare function buildCommitFrame(operations: readonly MutationOperation[], clientTxId: string, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null, track?: readonly TrackDependency[] | null): CommitMessage;
|
|
28
|
-
/**
|
|
29
|
-
* Defensively validate the optional `notifications` array off a commit ack.
|
|
30
|
-
* Untrusted wire data — a malformed entry is dropped rather than throwing,
|
|
31
|
-
* so a bad notification never sinks an otherwise-successful commit.
|
|
32
|
-
*/
|
|
33
|
-
export declare function parseNotifications(raw: unknown): StaleNotification[] | undefined;
|
|
34
|
-
/**
|
|
35
|
-
* The single place claim events are traced. Every `claim_*` frame passes
|
|
36
|
-
* through here, so a developer debugging a collision gets one consistent record
|
|
37
|
-
* — a console line and a structured capture — without each frame case
|
|
38
|
-
* re-deriving the row and holder shape. The wire payload is loosely typed
|
|
39
|
-
* (`Record<string, unknown>`), so this is the one place that narrows it into a
|
|
40
|
-
* {@link ClaimEvent}.
|
|
41
|
-
*/
|
|
42
|
-
export declare function recordClaim(phase: ClaimEvent['phase'], payload: Record<string, unknown>): void;
|
|
8
|
+
export { buildCommitFrame, parseNotifications, recordClaim, type CommitAck, type CommitFrameOperation, type ClaimTracePorts, } from '../transaction/transport/commitFrames.js';
|
|
@@ -1,99 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Moved to the settlement core with the duplex transport (ADR 0016): the
|
|
3
|
+
* commit-path frame builders are stateless wire helpers. This path re-exports
|
|
4
|
+
* them so existing importers stay unchanged. The core's `buildCommitFrame`
|
|
5
|
+
* takes the structural `CommitFrameOperation` slice, which this package's
|
|
6
|
+
* `MutationOperation` satisfies.
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
-
import { staleNotificationSchema, wireParticipantKindSchema, } from '../coordination/schema.js';
|
|
9
|
-
import { formatClaim } from '../coordination/trace.js';
|
|
10
|
-
/**
|
|
11
|
-
* Converts the client's list of {@link MutationOperation} values into the wire
|
|
12
|
-
* {@link CommitMessage} the server accepts. This is the one place the loosely
|
|
13
|
-
* typed operation — its `type` is a string, and it carries client-only
|
|
14
|
-
* `options` the server never reads — becomes the strict wire contract. Mapping
|
|
15
|
-
* each field by hand means a change to {@link CommitOperation} fails to compile
|
|
16
|
-
* here; the single `as` cast narrows the validated `type` to the wire union and
|
|
17
|
-
* is the only place that loosening happens.
|
|
18
|
-
*/
|
|
19
|
-
export function buildCommitFrame(operations, clientTxId, causedByTaskId, reads, track) {
|
|
20
|
-
const payload = {
|
|
21
|
-
operations: operations.map((op) => ({
|
|
22
|
-
type: op.type,
|
|
23
|
-
model: op.model,
|
|
24
|
-
id: op.id,
|
|
25
|
-
input: op.input,
|
|
26
|
-
transactionId: op.transactionId,
|
|
27
|
-
readAt: op.readAt,
|
|
28
|
-
onStale: op.onStale,
|
|
29
|
-
fenceToken: op.fenceToken,
|
|
30
|
-
})),
|
|
31
|
-
clientTxId,
|
|
32
|
-
};
|
|
33
|
-
if (causedByTaskId)
|
|
34
|
-
payload.causedByTaskId = causedByTaskId;
|
|
35
|
-
// The read set the batch was premised on: the rows or groups the writer read before committing.
|
|
36
|
-
if (reads && reads.length > 0)
|
|
37
|
-
payload.reads = [...reads];
|
|
38
|
-
// Durable read-dependencies the writer is registering: the rows or groups it
|
|
39
|
-
// wants to keep hearing about after this commit, delivered on a future receipt.
|
|
40
|
-
if (track && track.length > 0)
|
|
41
|
-
payload.track = [...track];
|
|
42
|
-
return { type: 'commit', payload };
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Defensively validate the optional `notifications` array off a commit ack.
|
|
46
|
-
* Untrusted wire data — a malformed entry is dropped rather than throwing,
|
|
47
|
-
* so a bad notification never sinks an otherwise-successful commit.
|
|
48
|
-
*/
|
|
49
|
-
export function parseNotifications(raw) {
|
|
50
|
-
if (!Array.isArray(raw) || raw.length === 0)
|
|
51
|
-
return undefined;
|
|
52
|
-
const out = [];
|
|
53
|
-
for (const entry of raw) {
|
|
54
|
-
const parsed = staleNotificationSchema.safeParse(entry);
|
|
55
|
-
if (parsed.success)
|
|
56
|
-
out.push(parsed.data);
|
|
57
|
-
}
|
|
58
|
-
return out.length > 0 ? out : undefined;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* The single place claim events are traced. Every `claim_*` frame passes
|
|
62
|
-
* through here, so a developer debugging a collision gets one consistent record
|
|
63
|
-
* — a console line and a structured capture — without each frame case
|
|
64
|
-
* re-deriving the row and holder shape. The wire payload is loosely typed
|
|
65
|
-
* (`Record<string, unknown>`), so this is the one place that narrows it into a
|
|
66
|
-
* {@link ClaimEvent}.
|
|
67
|
-
*/
|
|
68
|
-
export function recordClaim(phase, payload) {
|
|
69
|
-
const str = (v) => typeof v === 'string' ? v : undefined;
|
|
70
|
-
// Targets arrive flat ({ entityType, entityId }) or nested under `target`.
|
|
71
|
-
const target = payload.target && typeof payload.target === 'object'
|
|
72
|
-
? payload.target
|
|
73
|
-
: payload;
|
|
74
|
-
const kind = wireParticipantKindSchema.safeParse(payload.participantKind);
|
|
75
|
-
const event = {
|
|
76
|
-
phase,
|
|
77
|
-
claimId: str(payload.claimId),
|
|
78
|
-
model: str(target.entityType) ?? str(target.model),
|
|
79
|
-
id: str(target.entityId) ?? str(target.id),
|
|
80
|
-
field: str(target.field),
|
|
81
|
-
actor: str(payload.actor) ?? str(payload.heldBy),
|
|
82
|
-
participantKind: kind.success ? kind.data : undefined,
|
|
83
|
-
position: typeof payload.position === 'number' ? payload.position : undefined,
|
|
84
|
-
reason: str(payload.policyReason) ?? str(payload.reason),
|
|
85
|
-
};
|
|
86
|
-
const message = formatClaim(event);
|
|
87
|
-
// A rejection or lost lease is the collision a developer is actively
|
|
88
|
-
// debugging → warn (shows at the default log level). The routine events
|
|
89
|
-
// (acquired/queued/granted/expired) are debug-only so they never drown the
|
|
90
|
-
// console until you opt in with `new Ablo({ debug: true })`.
|
|
91
|
-
const isCollision = phase === 'rejected' || phase === 'lost';
|
|
92
|
-
const ctx = getContext();
|
|
93
|
-
if (isCollision)
|
|
94
|
-
ctx.logger.warn(message);
|
|
95
|
-
else
|
|
96
|
-
ctx.logger.debug(message);
|
|
97
|
-
ctx.observability.breadcrumb(message, 'sync.coordination', isCollision ? 'warning' : 'info');
|
|
98
|
-
ctx.observability.captureClaim(event);
|
|
99
|
-
}
|
|
8
|
+
export { buildCommitFrame, parseNotifications, recordClaim, } from '../transaction/transport/commitFrames.js';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The runtime context, sliced into the ports the settlement core's transport
|
|
3
|
+
* takes. The core is injected, never service-located (ADR 0016), while this
|
|
4
|
+
* package resolves its shared dependencies through `getContext()` — so these
|
|
5
|
+
* adapters bridge the two: each method reads the context at call time, which
|
|
6
|
+
* preserves the lazy semantics of `getContext()` (a context installed after
|
|
7
|
+
* construction is still picked up, and the pre-init fallback still applies).
|
|
8
|
+
*/
|
|
9
|
+
import type { Logger } from '../transaction/logger.js';
|
|
10
|
+
import type { SocketObservability } from '../transaction/observability.js';
|
|
11
|
+
/** The context's logger, resolved at call time. */
|
|
12
|
+
export declare const contextLogger: Logger;
|
|
13
|
+
/** The context's observability, resolved at call time, in the transport's shape. */
|
|
14
|
+
export declare const contextSocketObservability: SocketObservability;
|
|
15
|
+
/** The context's online-status provider, resolved at call time. */
|
|
16
|
+
export declare const contextOnlineStatus: {
|
|
17
|
+
isOnline: () => boolean;
|
|
18
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The runtime context, sliced into the ports the settlement core's transport
|
|
3
|
+
* takes. The core is injected, never service-located (ADR 0016), while this
|
|
4
|
+
* package resolves its shared dependencies through `getContext()` — so these
|
|
5
|
+
* adapters bridge the two: each method reads the context at call time, which
|
|
6
|
+
* preserves the lazy semantics of `getContext()` (a context installed after
|
|
7
|
+
* construction is still picked up, and the pre-init fallback still applies).
|
|
8
|
+
*/
|
|
9
|
+
import { getContext } from '../context.js';
|
|
10
|
+
/** The context's logger, resolved at call time. */
|
|
11
|
+
export const contextLogger = {
|
|
12
|
+
debug: (message, ...args) => { getContext().logger.debug(message, ...args); },
|
|
13
|
+
info: (message, ...args) => { getContext().logger.info(message, ...args); },
|
|
14
|
+
warn: (message, ...args) => { getContext().logger.warn(message, ...args); },
|
|
15
|
+
error: (message, ...args) => { getContext().logger.error(message, ...args); },
|
|
16
|
+
};
|
|
17
|
+
/** The context's observability, resolved at call time, in the transport's shape. */
|
|
18
|
+
export const contextSocketObservability = {
|
|
19
|
+
breadcrumb: (message, category, level, data) => {
|
|
20
|
+
getContext().observability.breadcrumb(message, category, level, data);
|
|
21
|
+
},
|
|
22
|
+
captureWebSocketError: (details) => {
|
|
23
|
+
getContext().observability.captureWebSocketError(details);
|
|
24
|
+
},
|
|
25
|
+
captureClaim: (event) => { getContext().observability.captureClaim(event); },
|
|
26
|
+
captureConflict: (event) => { getContext().observability.captureConflict(event); },
|
|
27
|
+
};
|
|
28
|
+
/** The context's online-status provider, resolved at call time. */
|
|
29
|
+
export const contextOnlineStatus = {
|
|
30
|
+
isOnline: () => getContext().onlineStatus.isOnline(),
|
|
31
|
+
};
|
|
@@ -1,51 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* The stream is built directly on the sync WebSocket and shares that one
|
|
8
|
-
* connection. It learns about other participants' claims from the same
|
|
9
|
-
* `presence_update` frames the {@link createPresenceStream} presence stream
|
|
10
|
-
* consumes — the server piggybacks each participant's `activeClaims` on every
|
|
11
|
-
* presence frame — and sends its own claims as `claim_begin` and
|
|
12
|
-
* `claim_abandon` frames.
|
|
13
|
-
*
|
|
14
|
-
* Wire frames:
|
|
15
|
-
* • Outbound `claim_begin` — announce a claim: `{ claimId, entityType,
|
|
16
|
-
* entityId, description, field?, estimatedMs? }`.
|
|
17
|
-
* • Outbound `claim_abandon` — release it: `{ claimId, entityType?,
|
|
18
|
-
* entityId? }`.
|
|
19
|
-
* • Inbound, via presence — `event.activeClaims`, each stamped with
|
|
20
|
-
* `declaredAt` and `expiresAt`.
|
|
21
|
-
* • Inbound `claim_rejected` — the server refused the claim, with conflict
|
|
22
|
-
* metadata.
|
|
2
|
+
* Moved to the settlement core (ADR 0016): claim push is coordination, and
|
|
3
|
+
* coordination is the product — a contending agent wants `claim_granted`
|
|
4
|
+
* pushed exactly as much as a person does. This path re-exports it so
|
|
5
|
+
* existing importers stay unchanged.
|
|
23
6
|
*/
|
|
24
|
-
|
|
25
|
-
import type { ClaimOptions, Claim, ClaimStream, PresenceTarget } from '../types/streams.js';
|
|
26
|
-
/**
|
|
27
|
-
* The wire capability the claim stream actually uses: subscribe to typed
|
|
28
|
-
* inbound frames, check liveness, and send outbound frames. `SyncWebSocket`
|
|
29
|
-
* satisfies it, so production wiring is unchanged — but depending on the port
|
|
30
|
-
* rather than the whole socket class lets a test drive it with a plain object,
|
|
31
|
-
* no cast. `Pick` carries the exact (generic, typed-payload) `subscribe`
|
|
32
|
-
* signature, so every handler stays fully typed.
|
|
33
|
-
*/
|
|
34
|
-
export type ClaimTransport = Pick<SyncWebSocket, 'subscribe' | 'isConnected' | 'send'>;
|
|
35
|
-
export interface ClaimStreamConfig {
|
|
36
|
-
/** Identity used to filter our own active claims out of `others`. */
|
|
37
|
-
participantId: string;
|
|
38
|
-
}
|
|
39
|
-
export interface AttachableClaimStream extends ClaimStream {
|
|
40
|
-
/**
|
|
41
|
-
* Mints a lease directly: sends the `claim_begin` frame and returns a held
|
|
42
|
-
* {@link Claim} that carries no row `data` (the resource layer reads the row
|
|
43
|
-
* and stamps it). This is an internal entry point, not part of the public
|
|
44
|
-
* {@link ClaimStream}; application code takes a claim through
|
|
45
|
-
* `ablo.<model>.claim({ id })`, which is built on this.
|
|
46
|
-
*/
|
|
47
|
-
claim(target: PresenceTarget, opts?: ClaimOptions): Claim;
|
|
48
|
-
attach(transport: ClaimTransport): void;
|
|
49
|
-
dispose(): void;
|
|
50
|
-
}
|
|
51
|
-
export declare function createClaimStream(config: ClaimStreamConfig, transport?: ClaimTransport | null): AttachableClaimStream;
|
|
7
|
+
export { createClaimStream, type ClaimTransport, type ClaimStreamConfig, type AttachableClaimStream, } from '../transaction/coordination/createClaimStream.js';
|